Разделение списка узлов пополам - PullRequest
4 голосов
/ 29 августа 2008
<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. Что не так с моими выборами?

Ответы [ 4 ]

7 голосов
/ 29 августа 2008

Когда вы делаете 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>
2 голосов
/ 29 августа 2008

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

Попробуйте считать (../ узел). Следующее даст правильный результат в моем тестовом 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>
0 голосов
/ 29 августа 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...