题
我有这样的XSL两个嵌套的循环,在这一刻我使用的位置(),但它不是我所需要的。
<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,问题是你不能改变一个变量(它更像是一个常数,你的设置)。所以递增计数器变量不起作用。
一个笨拙的解决方法,以获得连续数(1,2,3,4,...)将调用位置()获得“ABC”标签迭代,并再次调用位置()来获得嵌套的“高清”标签迭代。那么你就需要用它包含“高清”标签的数量乘以“ABC”迭代。这就是为什么这是一个“笨拙”的解决方法。
假设你有两个嵌套的“高清”标签中,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>
<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>
这是pythonquick的回答的扩展,处理的子元素的不同数目:
<xsl:for-each select="abc">
<xsl:variable name="level1Position" select="position()"/>
<xsl:variable name="priorCount" select="count(../abc[position() < $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>
不隶属于 StackOverflow