Вопрос

<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. Что не так с моими выборами?

Это было полезно?

Решение

Когда вы делаете 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>

Другие советы

Вы можете попробовать использовать функцию 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>

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

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

Попробуйте считать (../ узел). Следующее даст правильный результат в моем тестовом 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top