XPath zu finden, die nächste Vorfahren-element enthält ein element, ein Attribut mit einem bestimmten Wert
ancestor::foo[bar[@attr="val"]]
Ich dachte, das würde funktionieren, aber es ist nicht. Ich muss die nächsten foo
element in dem Baum, der hat ein bar
Kind-element, das wiederum hat eine attr
Attribut val
.
InformationsquelleAutor der Frage Core Xii | 2010-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte dies funktionieren:
oder alternativ
entspricht der zweiten
<bar>
elementInformationsquelleAutor der Antwort Gordon
Aktualisiert, um eine Lösung vorgesehen, durch OP.
Siehe @David s Antwort
Für eine Beispiel-xml-unten,
einen gültigen xpath-auf der Rückseite die Achse mit <drei> als Kontext-Knoten eine gültige Lösung ist
"./" optional ist. position() = 1 ist nicht optional, da sonst die Vorfahren
foo
Befriedigung der Prädikate würde auch zurückgegeben werden.Alte Antwort:ignorieren
Dies ist eine alte Frage. aber wer interessiert ist, sollte die folgenden bekommen Sie das, was die ursprüngliche Frage gedacht.
Reverse Achse
Vorwärts Achse
InformationsquelleAutor der Antwort santon
Meiner Meinung nach die beste Antwort kam von der person, die die Frage gestellt. Seine Lösung war, sollen wieder alle Vorfahren foos. Er will nur das nächste, das mit position()=1, so seine xpath-Ausdruck muss etwas geändert:
Wenn er schreibt, dass die
ancestor::foo[bar[@attr="val"]]
nicht etwas zurückkehren, also musste er ein anderes problem in seiner xml-oder in seiner Annahme über das aktuelle element in seinem XPath-Auswertung Kontext.Den anderen Antworten (beginnend mit //) nicht wirklich beantworten Sie die Frage und auch wenn Sie durch Zufall trafen sich die not eines Menschen, so dass Sie nicht effizient:
wählen Sie ALLE Elemente in der xml-Datei, anwenden von filtern auf Sie Sie anschließend.
Während das, was die relative xpath-vorgeschlagen durch mich oder die person, wurde diese Frage ist gerade dabei zu suchen, durch einige Elemente, angefangen vom aktuellen Knoten bis zu den Eltern-und Eltern etc. - es wird sehr effizient, auch bei großen XML-Dateien.
InformationsquelleAutor der Antwort David L.
Wenn Sie eine Datei wie folgt:
und Sie wollen, dass die
foo
Knoten mit den ids2
und3
d.h. die nächstenfoos
Ihrerbar
Nachkommen mitattr=val
folgende Werke:Wenn du weglassen
and not(descendant::foo)
erhalten Sie zusätzlich diefoo
mit der id0
.Die anderen Antworten für mich nicht funktioniert haben auf dem Allgemeinen Fall von meinem Beispiel.
Können Sie es testen, in Python:
ausgegeben:
Beachten Sie, dass der xpath verwendet werden, ist nicht effizient. Ich würde gerne lernen, ein effizienter.
InformationsquelleAutor der Antwort Ivan Ogai