Xslt 循环中的索引XSL

Xslt 循环中的索引XSL,xslt,loops,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>

我在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>

我想让这里的变量流畅地增加1,2,3,4,5…..n
不像1,2,3,1,2,3
你能给我一些关于这个存根的想法吗。多谢各位


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

使用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>

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

<xsl:for-each select="abc/def">
    <xsl:value-of select="position()"/>
</xsl:for-each>

如果您需要保持嵌套循环,请考虑添加另一个循环:

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

这是pythonquick答案的扩展,用于处理不同数量的子元素:

<xsl:for-each select="abc">  
    <xsl:variable name="level1Position" select="position()"/>
    <xsl:variable name="priorCount" select="count(../abc[position() &lt; $level1Position]/def)"/>  
    <xsl:for-each select="def">
        <xsl:variable name="level2Count" select="$priorCount + position()"/>
        <xsl:value-of select="$level2Count" />
    </xsl:for-each>
</xsl:for-each>

输入:

<root>
    <abc>
        <def>A</def>
        <def>B</def>
        <def>C</def>
    </abc>
    <abc>
        <def>D</def>
        <def>E</def>
    </abc>
    <abc>
        <def>F</def>
    </abc>
    <abc>
        <def>G</def>
        <def>H</def>
        <def>I</def>
    </abc>
</root>

A.
B
C
D
E
F
G
H
我

这不会产生1,2,3,4,。。。顺序,除非“abc”标记下只有一个嵌套的“def”标记。谢谢Chris Doggett,但我的问题是,当我在第二个循环中使用position()时,它从rezo继续,而不是第一个循环中的最后一个索引。所以我不能用你的建议!但是你的建议最近可能对我有用,再次感谢克里斯!非常感谢pythonquick,你的代码对我来说很好!这花了我很多时间。非常感谢。请注意,仅当每个
abc
具有相同数量的def子项时,此操作才有效。此外,这只适用于硬编码的
def
计数。非常有用!我添加了一个适用于不同数量的
def
儿童的附加答案。我的问题是:。你能给我一个解决办法吗。谢谢