Pergunta

<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>

Minha lista tem 12 nós, mas a segunda lista é sempre 8 e a primeira é sempre 4.O que há de errado com a minha seleciona?

Foi útil?

Solução

Quando você fizer count(*), o nó atual é o node elemento que está sendo processado.Você quer ou count(current()/node) ou last() (preferível), ou apenas calcular o ponto médio de uma variável para um melhor desempenho e um código mais claro:

<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>

Outras dicas

Você pode tentar usar o last() função que vai dar a você o tamanho do contexto atual:

<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>

Eu não sou, com certeza, mas parece-me que count(*) não está fazendo o que você pensa que é.Que conta o número de filhos do nó atual, não é o tamanho do nó atual lista.Você poderia imprimi-lo para verificar que é 8 ou 9, em vez de 12?

Utilização last() para obter o tamanho do contexto.

Tente de contagem(../node).A seguir serão dá o resultado correto no meu arquivo XML de teste (com um simples nós de raiz com elementos de nó), usando o xsltproc processador XSLT.

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top