代码之家  ›  专栏  ›  技术社区  ›  John Sheehan

将节点列表分成两半

  •  4
  • John Sheehan  · 技术社区  · 16 年前
    <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个。我的选择有什么问题?

    4 回复  |  直到 10 年前
        1
  •  7
  •   jelovirt    16 年前

    当你这样做的时候 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
  •  2
  •   samjudson    16 年前

    您可以尝试使用 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
  •  0
  •   A. Rex    16 年前

    我一点也不确定,但在我看来 count(*) 不是做你认为的事。它计算当前节点的子节点数,而不是当前节点列表的大小。你能把它打印出来看看是8还是9而不是12吗?

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

        4
  •  0
  •   codeape    16 年前

    尝试计数(../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>