XSLT - 添加动态ID和更改属性

时间:2015-07-15 08:51:22

标签: xml xslt xslt-2.0

我有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是否可能。

任何人都可以建议我一个答案我该怎么做?

提前致谢。

1 个答案:

答案 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>