query XPath sul nodo-set lavora come uno SQL dove
Domanda
un esempio di documento XML:
<xml>
<list>
<item refid="1" />
<item refid="3" />
</list>
<catalogue>
<model id="1"><details /></model>
<model id="2"><details /></model>
<model id="3"><details /></model>
</catalogue>
</xml>
Mi piacerebbe qualcosa di simile interrogazione // modello [@ id = (// voce / @ refid)] per ottenere tutte "modello" avere un id fa riferimento nella "lista"
Soluzione
Mi piacerebbe qualcosa di simile interrogazione // modello [@ id = (// voce / @ refid)] per ottenere tutte le "modello" avere un fatto riferimento id in "lista"
Il problema principale qui è la vostra mancanza di fiducia e non effettivamente in esecuzione un motore XPath per valutare le espressioni che è venuta in mente.
Se si valuta l'espressione XPath avete proposto:
//model[ @id = (//item/@refid) ]
vedrai che seleziona esattamente le (due) elementi model
, i cui attributi id
fa riferimento il refid
attributi degli elementi item
che sono figli di list
.
@ Jörn-Horstmann nella sua risposta già spiegato il motivo per cui si ottiene questi risultati.
Un'osservazione minore è quello di evitare in generale l'abbreviazione //
. Essa provoca l'intero documento da scansionare ed è molto inefficiente. In questo caso vorrei usare l'equivalente, ma probabilmente più veloce per valutare l'espressione XPath:
/*/catalogue/model[@id = /*/list/item/@refid]
Altri suggerimenti
L'un'espressione XPath dovrebbe già tornare esattamente quello che vuoi. Citando http://www.w3.org/TR/xpath/#booleans, 5 ° comma:
Se un oggetto da comparare è un set di nodi e l'altro è una stringa, il confronto sarà vera se e solo se v'è un nodo nel set-nodo tale che il risultato di eseguire il confronto sulla stringa valore del nodo e l'altra stringa è vero