我有一个包含多个嵌套<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" />
。我首先要做一个更好的例子
答案 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>