Question

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

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?

Était-ce utile?

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() &lt;= $mid]">
  <li>foo</li>
</xsl:for-each>
<xsl:for-each select="$nodes[$mid &lt; 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() &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>

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() &lt;= (count(../node) div 2)]">
    ...
</xsl:for-each>
<xsl:for-each select="node[(count(../node) div 2) &lt; position()]">
    ...
</xsl:for-each>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top