Split a list of nodes in half
<xsl:for-each select="./node [position() <= (count(*) div 2)]"> <li>foo</li> </xsl:for-each> <xsl:for-each select="./node [count(*) div 2 < position()]"> <li>bar</li> </xsl:for-each> My list has 12 nodes, but the second list is always 8, and the first is always 4. What is wrong with my choices?
+4
4 answers
When you execute count(*) , the current node is the processed element of the node . You want either count(current()/node) , or last() (preferably), or just calculate the midpoint for the variable for better performance and clearer code:
<xsl:variable name="nodes" select="node"/> <xsl:variable name="mid" select="count($nodes) div 2"/> <xsl:for-each select="$nodes[position() <= $mid]"> <li>foo</li> </xsl:for-each> <xsl:for-each select="$nodes[$mid < position()]"> <li>bar</li> </xsl:for-each> +7
Try counting (../ node). Below is the correct result in my test XML file (simple root of nodes with node elements) using the XSLT processor xsltproc.
<xsl:for-each select="node[position() <= (count(../node) div 2)]"> ... </xsl:for-each> <xsl:for-each select="node[(count(../node) div 2) < position()]"> ... </xsl:for-each> 0