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

È stato utile?

Soluzione

Quanto segue funziona per me in uno script XSLT;

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

Il risultato è l'ID 3 e 4, quindi il /root/el[@value=4][position()&lt;=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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top