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"

È stato utile?

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

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