Frage

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

Meine Liste hat 12 Knoten, aber die zweite Liste ist immer 8 und die erste ist immer 4.Was stimmt mit meinen Selects nicht?

War es hilfreich?

Lösung

Wenn Sie das tun count(*), der aktuelle Knoten ist der node Element, das verarbeitet wird.Du willst beides count(current()/node) oder last() (vorzugsweise) oder berechnen Sie einfach den Mittelpunkt einer Variablen für eine bessere Leistung und klareren Code:

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

Andere Tipps

Sie könnten versuchen, die zu verwenden last() Funktion, die Ihnen die Größe des aktuellen Kontexts angibt:

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

Ich bin mir überhaupt nicht sicher, aber es kommt mir so vor count(*) tut nicht das, was Sie denken.Dabei wird die Anzahl der Kinder des aktuellen Knotens gezählt, nicht die Größe der aktuellen Knotenliste.Könnten Sie es ausdrucken, um zu überprüfen, ob es 8 oder 9 statt 12 ist?

Verwenden last() um die Kontextgröße zu erhalten.

Versuchen Sie es mit count(../node).Das Folgende liefert das korrekte Ergebnis für meine Test-XML-Datei (ein einfaches Knotenstammverzeichnis mit Knotenelementen) unter Verwendung des XSLT-Prozessors 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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top