2009-05-30 144 views
14

我有两个嵌套循环在XSL这样,在这一刻我使用position(),但它不是我所需要的。索引循环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> 

你能给我一些关于这个存根的想法。非常感谢你!

回答

18

对于XSL,问题是你不能改变一个变量(它更像是你设置的常量)。所以递增计数器变量不起作用。我们可以调用position()来获取“abc”标记迭代,再调用position()来得到一个连续计数(1,2,3,4,...)嵌套的“def”标签迭代。然后,您需要将“abc”迭代与其包含的“def”标记数相乘。这就是为什么这是一个“笨拙”的解决方法。

假设你有两个嵌套的“高清”标签中,XSL将如下所示:具体

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

你是否应该:

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

这不会产生1,2,3,4,...序列除非有只有一个嵌套“abc”标签下的“def”标签。 – pythonquick 2009-05-30 06:08:35

+0

谢谢Chris Doggett,但我的问题是,当我在第二个循环中使用position()时,它从rezo继续,而不是在第一个循环中的最后一个索引。所以我不能使用你的建议!但你的建议最近可能对我有用,再次感谢克里斯! – gacon 2009-05-30 08:53:59

6

只要改变方式在选择项目循环需要保留嵌套循环,考虑加入另外一个这样的循环:

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

这是一个分机pythonquick的回答ension,处理子元素的不同数字:

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