2008-08-29 3 views

ответ

7

Когда вы делаете count(*), текущий узел является обрабатываемым элементом node. Вы хотите, либо count(current()/node) или last() (предпочтительно), или просто вычислить среднюю точку в переменную для лучшей производительности и более четкого кода:

<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 наверняка .. :-) – 2010-01-27 06:33:57

0

Я совсем не уверен, но мне кажется, что count(*) не делает то, что вы думаете. Это подсчитывает количество дочерних узлов текущего узла, а не размер текущего списка узлов. Не могли бы вы распечатать его, чтобы проверить, что это 8 или 9 вместо 12?

Используйте last(), чтобы получить размер контекста.

0

кол Try (../ узел). Ниже приведен правильный результат в моем тестовом XML-файле (простой корень узлов с элементами узла) с использованием 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> 
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> 
Смежные вопросы