Como obter o elemento TOP N correspondente a uma condição com XPath
Pergunta
Eu tenho um XML como este
<root>
<el id="1" value="3"/>
<el id="2" value="3"/>
<el id="3" value="4"/>
<el id="4" value="4"/>
<el id="5" value="4"/>
<el id="6" value="4"/>
</root>
Eu gostaria com um xpath (estou em um contexto c #, não em um modelo xslt), obter os 2 primeiros elementos com um valor de 4, ou seja,
<el id="3" value="4"/>
<el id="4" value="4"/>
com /root/el[position() <= 2 and @value=4]
eu obteria 0 elemento porque position () é baseado no nó pai, não no subconjunto atual.
Posso fazer isso em c #, mas parece inútil carregar 1200 nós quando preciso apenas de 20.
Obrigado
Solução
O seguinte funciona para mim em um script XSLT;
<xsl:template match="/">
<xsl:apply-templates select="/root/el[@value=4][position()<=2]" />
</xsl:template>
O resultado são ids 3 e 4, então o /root/el[@value=4][position()<=2]
XPATH deve funcionar para você.
Outras dicas
A resposta de @rsp está correta, mas gostaria de acrescentar uma explicação.Nem sempre é verdade que [cond1 and cond2]
é equivalente a [cond1][cond2]
.Você precisa do segundo formulário.
Sua expressão:
/root/el[position() <= 2 and @value=4]
... seleciona todos os elementos el
que têm um atributo value
igual a 4
e cuja posição é menor ou igual a 2
.Não existem tais elementos no seu documento.
Você quer:
/root/el[@value=4][position() <= 2]
... que primeiro seleciona todos os elementos el
que têm um atributo value
igual a 4
e, em seguida, filtra essa lista por posição, conforme desejado.