对嵌套<xsl:for-each> </xsl:for-each>末尾的节点编号

时间:2010-01-12 13:52:02

标签: xslt

我有一个包含多个嵌套<xsl:for-each><xsl:apply-templates>的XSLT转换。

现在我需要在for-each和apply-templates的末尾对节点进行编号。我尝试的所有东西都只是在每个级别上编号迭代(方程式1,2,3,4,1,2,1,2,3,4,但我需要1,2,3,4,5,6, 7,8,9,10)

我对XSLT缺乏经验,但尝试使用<xsl:number>position()的不同变体解决此问题。

的test.xml

<A>
    <B>
        <C/>
        <C/>
        <C/>
        <C/>
    </B>
    <B>
        <C/>
        <C/>
    </B>
</A>

text.xsl:

<xsl:template match="A">
    <xsl:for-each select="B">
        <xsl:for-each select="C">
            <xsl:number/>,
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

test.out

1,2,3,4,1,2,

我想

1,2,3,4,5,6

编辑:此示例很简单,适用于<xsl:number level="any" />。我首先要做一个更好的例子

3 个答案:

答案 0 :(得分:3)

<xsl:number value="count(preceding::C) + 1"/><xsl:if test="following::C">,</xsl:if>

(或类似的东西)应该这样做。

答案 1 :(得分:1)

尝试:

<xsl:template match="A/B/C">
  <xsl:value-of select="position()" />
</xsl:template>

position()始终返回当前正在处理的一批节点中当前节点的位置。你的解决方案:

<xsl:template match="A">
  <xsl:for-each select="B">
    <xsl:for-each select="C">
      <xsl:number/>,
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

处理四批节点:

  • 一批<A>个节点。他们从第1位到第1位。
  • 一批<B>个节点。他们从第1位到第2位。
  • 两批<C>个节点。他们从位置1-4和1-2

在我的解决方案处理过程中,直接选择它们:

  • 一批<C>个节点。他们从1-6位开始。

答案 2 :(得分:0)

您可以增加变量:

<xsl:template match="A">
    <xsl:variable name="count" select="1"/>
    <xsl:for-each select="B">
        <xsl:for-each select="C">
            <xsl:variable name="count" select="$count + 1"/>
            <xsl:value-of select="count" />,
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>