【问题标题】:index in loop XSL循环 XSL 中的索引
【发布时间】:2009-05-30 03:31:19
【问题描述】:

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

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

【问题讨论】:

    标签: xslt loops


    【解决方案1】:

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

    【讨论】:

    • 非常感谢pythonquick,你的代码对我来说工作得很好!我浪费了很多时间。谢谢!
    • 请注意,这只有在每个 abc 具有相同数量的 def 子节点时才有效。此外,这仅适用于硬编码的 def 计数。
    • 非常有帮助!我添加了一个额外的答案,适用于可变数量的 def 孩子。
    • 我的问题在这里:stackoverflow.com/questions/26809765/…。你能给我一个解决方案吗?谢谢。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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>
      

      【讨论】:

      • 这不会产生 1,2,3,4,... 序列,除非“abc”标签下只有一个嵌套的“def”标签。
      • 谢谢 Chris Doggett,但我的问题是,当我在第二个循环中使用 position() 时,它会从 rezo 继续,而不是第一个循环中的最后一个索引。所以我不能使用你的建议!但是你的建议最近可能对我有用,再次感谢克里斯!
      【解决方案4】:

      这是处理不同数量子元素的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>
      

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 1970-01-01
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 2021-07-08
        • 2017-12-29
        • 2012-10-11
        相关资源
        最近更新 更多