2008-08-29 8 views
4
<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> 

Ma liste a 12 nœuds, mais la deuxième liste est toujours 8 et la première est toujours 4. Quel est le problème avec mes sélections?Division d'une liste de nœuds en deux

Répondre

7

Lorsque vous faites count(*), le nœud actuel est l'élément node en cours de traitement. Vous voulez soit count(current()/node) ou last() (de préférence) ou calculer simplement le point médian à une variable pour une meilleure performance et code plus clair:

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

+1 sûr .. :-) –

0

Je ne suis pas du tout sûr, mais il me semble que count(*) ne fait pas ce que vous pensez qu'il est. Cela compte le nombre d'enfants du nœud actuel, pas la taille de la liste de nœuds actuelle. Pourriez-vous l'imprimer pour vérifier que c'est 8 ou 9 au lieu de 12?

Utilisez last() pour obtenir la taille du contexte.

0

comte Try (../ nœud). Ce qui suit donnera le résultat correct sur mon fichier XML de test (une simple racine de nœuds avec des éléments de nœud), en utilisant le processeur XSLT xsltproc.

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

Vous pouvez essayer d'utiliser la fonction last() qui vous donnera la taille du contexte actuel:

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