Come ottenere l'elemento TOP N corrispondente a una condizione con XPath
Domanda
Ho un XML come questo
<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>
Vorrei con un xpath (sono in un contesto c # non in un modello xslt) ottenere il primo elemento 2 con un valore di 4 cioè
<el id="3" value="4"/>
<el id="4" value="4"/>
con /root/el[position() <= 2 and @value=4]
otterrei 0 elemento perché position () si basa sul nodo genitore, non sul sottoinsieme corrente.
Posso farlo in c # ma sembra inutile caricare 1200 nodi quando ne ho solo bisogno 20.
Grazie
Soluzione
Quanto segue funziona per me in uno script XSLT;
<xsl:template match="/">
<xsl:apply-templates select="/root/el[@value=4][position()<=2]" />
</xsl:template>
Il risultato è l'ID 3 e 4, quindi il /root/el[@value=4][position()<=2]
XPATH dovrebbe funzionare per te.
Altri suggerimenti
La risposta di @rsp è corretta, ma vorrei aggiungere una spiegazione.Non è sempre vero che [cond1 and cond2]
è equivalente a [cond1][cond2]
.Hai bisogno del secondo modulo.
La tua espressione:
/root/el[position() <= 2 and @value=4]
... seleziona tutti gli elementi el
che hanno un attributo value
uguale a 4
e la cui posizione è minore o uguale a 2
.Non ci sono tali elementi nel tuo documento.
Vuoi:
/root/el[@value=4][position() <= 2]
... che seleziona prima tutti gli elementi el
che hanno un attributo value
uguale a 4
e poi filtra l'elenco in base alla posizione, come desiderato.