Wie erstellen Sie einen xpath um Elemente auszuwählen, die nicht eine Zeichenfolge enthalten
Wie benutze ich etwas ähnliches wie auf dem Beispiel unten, aber mit dem entgegengesetzten Ergebnis, ich.e-Elemente, die nicht enthalten (default)
im text.
<test>
<item>Some text (default)</item>
<item>Some more text</item>
<item>Even more text</item>
</test>
Angesichts dieser
//test/item[contains(text(), '(default)')]
zurückgeben würde das erste Element. Gibt es einen not-operator, die ich nutzen kann mit enthält?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, gibt es:
Hinweis:
not()
ist eine Funktion, in XPath anstelle eines operators.Alternative, möglicherweise bessere Art, dies auszudrücken ist:
Es ist ein feiner, aber wichtiger Unterschied zwischen den beiden Ausdrücken (nennen wir Sie A und B, respektive).
Einfachen Fall: Wenn alle
<item>
nur einen einzelnen text-Knoten Kind, beide A und B Verhalten sich gleich.Komplexen Fall: Wenn
<item>
können mehrere text-Knoten-Kinder-Ausdruck Einer nur Spiele, wenn'(default)'
tritt in der ersten von Ihnen.Dies ist, weil
text()
passt auf alle text-Knoten-Kinder und erzeugt ein node-set. So weit keine überraschung. Jetztcontains()
übernimmt ein node-set als erstes argument, aber es muss für die Konvertierung in einen string um seine Arbeit zu tun. Und Umwandlung von Knoten-setzen-zu-string-erzeugt nur den string-Wert des ersten Knotens in der Menge, alle anderen Knoten werden ignoriert (versuchenstring(//item)
um zu sehen, was ich meine). Im einfachen Fall ist dies genau das, was passiert, aber das Ergebnis ist nicht so überraschend.Ausdruck B befasst sich mit dieser, indem Sie explizit die überprüfung jeder text-Knoten einzeln statt nur die überprüfung der string-Wert des gesamten
<item>
element. Es ist daher die robustere der beiden.