获取节点位置作为元素的属性

时间:2019-07-08 07:12:35

标签: xslt

我想获取节点位置作为元素的属性。我的意思是我想在id元素内获取Aut-01值,例如Aut-02context。我在下面提到了输入,输出和尝试的代码。我正在使用XSLT 2.0

输入:

       <con-group>
            <con c-type="aut">
                <name>
                    <fname>Kent-Dennis</fname>
                </name>
            </con>
            <con c-type="aut">
                <name>
                    <fname>dfr-gvfrt</fname>
                </name>
            </con>
            <con c-type="aut">
                <con-id con-id-type="ABC11"
                    >https://wasq.lk/0000-0002-8551-9535</con-id>
                <name>
                    <fname>Glazier</fname>
                </name>
            </con>
            <con c-type="aut">
                <con-id con-id-type="ABC12"
                    >https://wasq.lk/0000-0002-8551-8535</con-id>
                <name>
                    <fname>Glazier</fname>
                </name>
            </con>
      </con-group>

输出应为:

    <link ref="https://orcid.org/0000-0002-8551-9535">
        <context type="Aut" id="Aut-01">
            <image ref="../../../../command/Templates/Template Art/Auth_.jpg"/>
        </context><s/>
    <link>

    <link ref="https://orcid.org/0000-0002-8551-9535">
        <context type="Aut" id="Aut-02">
            <image ref="../../../../command/Templates/Template Art/Auth_.jpg"/>
        </context><s/>
    <link>

尝试代码:

<xsl:template match="con-id">
    <xsl:text>&#x2009;</xsl:text>
    <link ref="{.}">
        <xsl:variable name="aaa" select="count(self::con-id/preceding-sibling::*)+1"/>
        <context type="Aut" id="{$aaa}">
            <image ref="../../../../command/Templates/Template Art/Auth_.jpg"/>
        <context><s/>
    </link>
</xsl:template>

帮我解决这个问题。我总是1获得ID值。作为我的代码,我没有得到想要的输出。

3 个答案:

答案 0 :(得分:2)

您每次都会得到1,因为con-id没有在前的兄弟姐妹。 (如果元素具有相同的父元素,则它们是兄弟姐妹)。您应该算出父级的前级兄弟姐妹(但前提是前级兄弟姐妹看起来像con-id

<xsl:variable name="aaa" select="count(parent::*/preceding-sibling::*[con-id])+1"/>

或者,您可以使用preceding

<xsl:variable name="aaa" select="count(preceding::con-id)+1"/>

您也可以在此处使用xsl:number

<xsl:variable name="aaa">
    <xsl:number count="con[con-id]" />
</xsl:variable>

如果您想使用position(),则必须添加另一个模板来匹配con-group,然后仅选择con-id元素(尽管只有在您没有的情况下,它才能真正起作用您想要执行的其他处理可能会发生冲突。

<xsl:template match="con-group">
    <xsl:apply-templates select="*/con-id" />
</xsl:template>

<xsl:template match="con-id">
    <xsl:text>&#x2009;</xsl:text>
    <link ref="{.}">
        <xsl:variable name="aaa" select="position()" />
        <context type="Aut" id="{$aaa}">
            <image ref="../../../../command/Templates/Template Art/Auth_.jpg"/>
        </context><s/>
    </link>
</xsl:template>

答案 1 :(得分:0)

检查此代码:-

<xsl:template match="con">
    <xsl:variable name="aaa" select="position()"/>
<xsl:for-each select="con-id">
    <xsl:text>&#x2009;</xsl:text>
    <link ref="{.}">
        <context type="Aut" id="{$aaa}">
            <image ref="../../../../command/Templates/Template Art/Auth_.jpg"/>
        </context>
    </link>
    </xsl:for-each>
</xsl:template>

答案 2 :(得分:0)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="//con-id">
<link ref="{.}">
        <xsl:variable name="aaa" select="position()"/>
        <context type="Aut" id="{$aaa}">
            <image ref="../../../../command/Templates/Template Art/Auth_.jpg"/>
        </context>
    </link>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>