Filtern mit XPath nach allen Elementen ohne ein bestimmtes Attribut

Mein XPath ist ein wenig rostig... Nehmen wir an, ich habe diese einfache XML-Datei:

<?xml version="1.0" encoding="utf-8" ?>
<States xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<States>
<StateProvince name="ALABAMA" abbrev="AL" />
....
<StateProvince name="AMERICAN SAMOA" abbrev="AS" territory="true"  />
</States>
</States>

Ich möchte eine einfache XPath-Abfrage ausführen, um alle wahren Zustände zu analysieren (also nicht in Zuständen ziehen, in denen Territory = true). Ich habe versucht, 'StateProvince[@territory!='true'], aber ich habe Null. Andere Varianten scheinen zu scheitern. Das scheint einfach zu sein, aber nicht zu finden, was ich will.

Jede Hilfe geschätzt.

Antwort auf "Filtern mit XPath nach allen Elementen ohne ein bestimmtes Attribut " 3 von antworten

Sie sind ganz nah dran:

//StateProvince[not(@territory) or @territory != 'true']

Sollte Ihnen das gewünschte Ergebnis bringen.

Das sollte funktionieren:

//StateProvince[not(@territory='true')]

Ein XPath-Ausdruck, der die gewünschten Elemente auswählt:

         /*/States/StateProvince[not(@territory='true')]

Beachten Sie , dass man nach Möglichkeit die Abkürzung // vermeiden muss, da es bewirkt, dass das gesamte Dokument (Unterstruktur, die am Kontextknoten verwurzelt ist) gescannt wird.

Der obige XPath-Ausdruck vermeidet die Verwendung der // Abkürzung unter Berücksichtigung der Struktur des ursprünglich bereitgestellten XML-Dokuments.

Nur wenn die Struktur des XML-Dokuments völlig unbekannt ist (und der XPath-Ausdruck für viele XML-Dokumente mit unbekannter Struktur vorgesehen ist), sollte die Verwendung der Abkürzung // als betrachtet werden.