2008-08-29 8 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 개의 노드가 있지만 두 번째 목록은 항상 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

일을 .. :-) –

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>