De la division d'une liste de nœuds dans la moitié
Question
<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>
A ma liste de 12 nœuds, mais la deuxième liste est toujours 8 et le premier est toujours de 4.Quel est le problème avec mon sélectionne?
La solution
Lorsque vous ne count(*)
, le nœud courant est l' node
l'élément en cours de traitement.Vous souhaitez count(current()/node)
ou last()
(de préférence), ou simplement calculer le point milieu d'une variable pour une meilleure performance et le code plus clair:
<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>
Autres conseils
Vous pouvez essayer d'utiliser l' last()
la fonction qui va vous donner la taille du contexte actuel:
<xsl:for-each select="./node [position() <= last() div 2]">
<li>foo</li>
</xsl:for-each>
<xsl:for-each select="./node [last() div 2 < position()]">
<li>bar</li>
</xsl:for-each>
Je ne suis pas sûr, mais il me semble que count(*)
n'est pas faire ce que vous pensez qu'il est.Qui compte le nombre d'enfants du noeud courant, pas la taille actuelle de la liste de nœuds.Pourriez-vous l'imprimer pour vérifier que c'est 8 ou 9 au lieu de 12?
Utilisation last()
pour obtenir la taille de contexte.
Essayez de compter(../nœud).La suite vous donne le résultat correct sur mon test de fichier XML (un simple nœuds racine avec des éléments de nœuds), à l'aide de la xsltproc processeur XSLT.
<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>