Pergunta
<xsl:for-each select="./node [position() <= (count(*) div 2)]">
<li>foo</li>
</xsl:for-each>
<xsl:for-each select="./node [count(*) div 2 < 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?
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() <= $mid]">
<li>foo</li>
</xsl:for-each>
<xsl:for-each select="$nodes[$mid < 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() <= last() div 2]">
<li>foo</li>
</xsl:for-each>
<xsl:for-each select="./node [last() div 2 < 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() <= (count(../node) div 2)]">
...
</xsl:for-each>
<xsl:for-each select="node[(count(../node) div 2) < position()]">
...
</xsl:for-each>