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

私のリストには、12個のノードを持っているが、2番目のリストは常に8で、最初はいつも私の選択が間違って何4.ですか?半分内のノードのリストを分割

答えて

7

count(*)を実行すると、現在のノードは処理中のnode要素になります。

<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

私は完全にはわかりませんが、count(*)はあなたが思っていることをしていないようです。これは現在のノードリストのサイズではなく、現在のノードの子の数を数えます。 12の代わりに8または9であることを確認するためにそれを印刷できますか?

last()を使用してコンテキストサイズを取得します。

0

トライ回数(../ノード):あなたは、どちらかがcount(current()/node)またはlast()(望ましい)、または単に優れたパフォーマンスと明確なコードの変数への中間点を計算します。以下は、xsltproc XSLTプロセッサーを使用して、テストXMLファイル(ノード要素を持つ単純なノードのルート)で正しい結果を得られます。

<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

あなたはあなたの現在のコンテキストの大きさを与えるlast()機能使用して試みることができる:確かに

<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> 
関連する問題