2008-08-29 49 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> 

Listem 12 düğüme sahiptir, ancak ikinci liste her zaman 8'dir ve ilki her zaman 4'tür. Seçimlerimdeki sorun nedir?Düğümlerin bir listesini ikiye bölme

cevap

7

count(*)'u yaptığınızda, geçerli düğüm işlenmekte olan node öğedir.

<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 .. :-) –

0

Emin değilim ama bana öyle geliyor ki, count(*) düşündüğünüzü yapmıyor. Bu, geçerli düğümün çocuk sayısını sayar, mevcut düğüm listesinin büyüklüğünü değil. 12 yerine 8 veya 9 olduğunu kontrol etmek için yazdırır mısınız?

Bağlam boyutunu elde etmek için last() kullanın.

0

deneyin sayımı (../ düğüm): Ya count(current()/node) veya last() (tercih), ya da sadece daha iyi performans ve daha net kodu için bir değişkene orta noktayı hesaplamak istiyoruz. Aşağıdaki xsltproc XSLT işlemci kullanarak benim test XML dosyası (düğüm öğeleri ile basit bir düğüm kök) doğru sonuç verir.

<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

Yapabilirsin aktüel bağlamda boyutunu verecek last() işlevini kullanmayı deneyin: kesin

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