我有xml文件,如下,
<doc>
<a ref="Foot"></a>
<a ref="Foot"></a>
<a ref="Foot"></a>
<a ref="End"></a>
<a ref="End"></a>
<a ref="End"></a>
<doc>
我的要求是将动态增量id属性添加到具有<a>
属性的"End"
节点。并使用"Foot"
更改"End"
属性,以便结果文档为
<doc>
<a ref="End" id="1"></a>
<a ref="End" id="2"></a>
<a ref="End" id="3"></a>
<a ref="End" id="4"></a>
<a ref="End" id="5"></a>
<a ref="End" id="6"></a>
<doc>
我能够向节点添加动态id并使用“End”更改“Foot”属性,但id仅添加到之前具有“End”属性的节点。具有属性“Foot”的节点不添加id。我当前的输出如下,
<doc>
<a ref="End"></a>
<a ref="End"></a>
<a ref="End"></a>
<a ref="End" id="1"></a>
<a ref="End" id="2"></a>
<a ref="End" id="3"></a>
<doc>
我的xsl代码如下,
//adds dynamic id's to foot node
<xsl:template match="a/@ref[.='End']">
<xsl:attribute name="id">
<xsl:number count="a[@ref='End']" level="any"></xsl:number>
</xsl:attribute>
</xsl:template>
//change attribute "Foot" to attribute "End"
<xsl:template match="a/@ref[. = 'Foot']">
<xsl:attribute name="id">End</xsl:attribute>
</xsl:template>
我的问题是如何将id添加到前三个节点。我可以使用xsl变量,但我是xslt的新手,我不知道如何使用变量。如果我们可以首先将“Foot”属性设置为“End”属性会话,然后添加id,那么代码将运行正常。我也不知道xslt是否可能。
任何人都可以建议我一个答案我该怎么做?
提前致谢。
答案 0 :(得分:2)
如果您想按顺序对所有 a
元素进行编号,无论@ref
属性包含哪些内容,您为什么不这么做:
<xsl:template match="a">
<a id="{position()}">
<xsl:apply-templates select="@*|node()"/>
</a>
</xsl:template>
或者,如果您还想将所有这些转换为ref="End"
(并假设它们没有内容),那么更简单:
<xsl:template match="a">
<a ref="End" id="{position()}"/>
</xsl:template>