【问题标题】:Dividing a list of nodes in half将节点列表分成两半
【发布时间】:2010-09-07 05:44:12
【问题描述】:
<xsl:for-each select="./node [position() &lt;= (count(*) div 2)]">
    <li>foo</li>
</xsl:for-each>
<xsl:for-each select="./node [count(*) div 2 &lt; position()]">
    <li>bar</li>
</xsl:for-each>

我的列表有 12 个节点,但第二个列表总是 8,第一个总是 4。我的选择有什么问题?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    当您执行count(*) 时,当前节点是正在处理的node 元素。您想要count(current()/node)last()(首选),或者只计算变量的中点以获得更好的性能和更清晰的代码:

    <xsl:variable name="nodes" select="node"/>
    <xsl:variable name="mid" select="count($nodes) div 2"/>
    <xsl:for-each select="$nodes[position() &lt;= $mid]">
      <li>foo</li>
    </xsl:for-each>
    <xsl:for-each select="$nodes[$mid &lt; position()]">
      <li>bar</li>
    </xsl:for-each>
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用last() 函数,该函数将为您提供当前上下文的大小:

      <xsl:for-each select="./node [position() &lt;= last() div 2]">
         <li>foo</li>
      </xsl:for-each>
      <xsl:for-each select="./node [last() div 2 &lt; position()]">
         <li>bar</li>
      </xsl:for-each>
      

      【讨论】:

        【解决方案3】:

        我完全不确定,但在我看来count(*) 并没有按照你的想法做。这计算当前节点的子节点数,而不是当前节点列表的大小。你能打印出来看看是 8 还是 9 而不是 12?

        使用last() 获取上下文大小。

        【讨论】:

          【解决方案4】:

          尝试计数(../node)。下面将使用 xsltproc XSLT 处理器在我的测试 XML 文件(带有节点元素的简单节点根)上给出正确的结果。

          <xsl:for-each select="node[position() &lt;= (count(../node) div 2)]">
              ...
          </xsl:for-each>
          <xsl:for-each select="node[(count(../node) div 2) &lt; position()]">
              ...
          </xsl:for-each>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-19
            • 2016-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多