Domanda

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

La mia lista ha 12 nodi, ma la seconda lista è sempre 8 e la prima è sempre 4.Cosa c'è che non va nelle mie selezioni?

È stato utile?

Soluzione

Quando lo fai count(*), il nodo corrente è il node elemento in lavorazione.Anche tu lo vuoi count(current()/node) O last() (preferibile), o semplicemente calcolare il punto medio di una variabile per prestazioni migliori e codice più chiaro:

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

Altri suggerimenti

Potresti provare a usare il file last() funzione che ti darà la dimensione del contesto corrente:

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

Non ne sono affatto sicuro, ma mi sembra di sì count(*) non sta facendo quello che pensi che sia.Ciò conta il numero di figli del nodo corrente, non la dimensione dell'elenco dei nodi corrente.Potresti stamparlo per verificare che sia 8 o 9 invece di 12?

Utilizzo last() per ottenere la dimensione del contesto.

Prova count(../node).Quanto segue fornirà il risultato corretto sul mio file XML di prova (una semplice radice dei nodi con elementi nodo), utilizzando il processore 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top