每次模板运行时,XSL会自动递增一个数字

时间:2014-05-13 15:10:46

标签: xml xslt xpath

我是XML / XSL的新手,所以我会尝试尽可能具有描述性。我有一个XML元素,我需要填充一个值,给出一个数字,每次找到该元素时,该数字会递增。

这是我到目前为止所拥有的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="count">
    <xsl:number level="any" value="position()"/>
</xsl:variable>

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template name="index">
    <xsl:param name="counter" select="''"/>
    <xsl:value-of select="$count"/>
</xsl:template>

<xsl:template match="//file_item_nbr">
    <file_item_nbr>
        <xsl:call-template name="index">
            <xsl:with-param name="counter" select="''">
                <!--<xsl:value-of select="$count + 1"/-->
            </xsl:with-param>
        </xsl:call-template>
    </file_item_nbr>
</xsl:template>
</xsl:stylesheet>

XML数据具有嵌套在其他元素中的各种file_item_nbr标记。这就是为什么模板使用// file_item_nbr xpath在所有file_item_nbr元素上匹配的原因。

如何增加每个file_item_nbr的数字?

1 个答案:

答案 0 :(得分:2)

您使用<xsl:number level="any"/>进入了正确的轨道,但您需要在每次需要时评估此说明。目前您正在评估它一次,将结果存储在变量中,然后每次都插入该预先计算的值。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="file_item_nbr">
    <file_item_nbr>
      <xsl:number level="any"/>
    </file_item_nbr>
  </xsl:template>
</xsl:stylesheet>