XPath-Abfrage auf Knoten-Set arbeitet wie ein SQL, wo in
Frage
eine Stichprobe von XML-Dokument:
<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>
ich Abfrage so etwas wie // Modell möchten [@id = (// Artikel / @ refid)] zu erhalten all „Modell“ mit einer referenzierten-ID in „Liste“
Lösung
würde ich Abfrage etwas mögen // model [@id = (// Artikel / @ refid)] zu erhalten alle „Modell“ mit einem referenzierten id in "Liste"
Das Hauptproblem hier ist Ihr Mangel an Vertrauen und eigentlich keine XPath Motor läuft, die Ausdrücke zu bewerten Sie habe kommen mit.
Wenn Sie bewerten den XPath-Ausdruck, den Sie vorgeschlagen:
//model[ @id = (//item/@refid) ]
siehe Sie werden feststellen, dass es wählt genau die (zwei) model
Elemente, deren id
Attribute referenziert werden durch die refid
Attribute von item
Elemente, die Kinder von list
sind.
@ Jörn-Horstmann in seiner Antwort schon erklärt, warum man diese Ergebnisse zu erhalten.
Ein kleiner Hinweis ist in der Regel zu vermeiden, dass die //
Abkürzung mit . Es bewirkt, dass das gesamte Dokument gescannt werden und ist sehr ineffizient. In diesem Fall würde ich das äquivalent verwenden, aber wahrscheinlich schnellen XPath-Ausdruck zu bewerten:
/*/catalogue/model[@id = /*/list/item/@refid]
Andere Tipps
Ihr XPath-Ausdruck sollte schon genau zurückgeben, was Sie wollen. Zitiert von http://www.w3.org/TR/xpath/#booleans, 5. Absatz:
Wenn ein Objekt verglichen werden soll, ein Knotenmenge und der andere ein String ist, dann wird der Vergleich wahr, wenn und nur wenn es einen Knoten in der Knotenmenge, so dass das Ergebnis der Durchführung des Vergleichs auf die String-Wert des Knotens und die andere Zeichenfolge true