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

Foi útil?

Solução

O seguinte funciona para mim em um script XSLT;

  <xsl:template match="/">
    <xsl:apply-templates select="/root/el[@value=4][position()&lt;=2]" />
  </xsl:template>

O resultado são ids 3 e 4, então o /root/el[@value=4][position()&lt;=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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top