循环XSL中的索引

gac*_*con 15 xslt loops

我在这样的XSL中有两个嵌套循环,此时我使用position(),但这不是我需要的.

<xsl:for-each select="abc">
  <xsl:for-each select="def">
   I wanna my variable in here increasing fluently 1,2,3,4,5.....n
not like 1,2,3,1,2,3
  </xsl:for-each>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

你能给我一些这个存根的想法吗?非常感谢你!

pyt*_*ick 22

使用XSL,问题是您无法更改变量(它更像是您正在设置的常量).因此,递增计数器变量不起作用.

获得顺序计数(1,2,3,4,...)的笨拙解决方法是调用position()来获取"abc"标记迭代,并调用position()来获取嵌套的"def" "标记迭代.然后,您需要将"abc"迭代与其包含的"def"标记的数量相乘.这就是为什么这是一个"笨拙"的解决方法.

假设您有两个嵌套的"def"标记,XSL将如下所示:

<xsl:for-each select="abc">
    <xsl:variable name="level1Count" select="position() - 1"/>
    <xsl:for-each select="def">
        <xsl:variable name="level2Count" select="$level1Count * 2 + position()"/>
        <xsl:value-of select="$level2Count" />
    </xsl:for-each>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)


mou*_*sio 6

只需更改选择要循环的项目的方式:

<xsl:for-each select="abc/def">
    <xsl:value-of select="position()"/>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

如果您特别需要保留嵌套循环,请考虑添加另一个循环,如下所示:

<xsl:variable name="items" select="//abc/def"/>
<xsl:for-each select="abc">
    <xsl:for-each select="def">
        <xsl:variable name="id" select="generate-id()"/>
        <xsl:for-each select="$items">
            <xsl:if test="generate-id()=$id">
                 <xsl:value-of select="position()"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)


Chr*_*ett 5

<xsl:for-each select="abc">
    <xsl:variable name="i" select="position()"/>
    <xsl:for-each select="def">
        <xsl:value-of select="$i" />
    </xsl:for-each>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)