Das XML-Dokument:
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
Der XPath-Ausdruck:
//*[contains(text(), 'ABC')]
//*
Entspricht einem beliebigen untergeordneten Element des Stammknotens . Das heißt, jedes Element außer dem Wurzelknoten.
[...]
ist ein Prädikat , es filtert die Knotenmenge. Es gibt Knoten , für die ...
ist true
:
Ein Prädikat filtert eine [...] Knotenmenge, um eine neue Knotenmenge zu erzeugen. Für jeden zu filternden Knoten in der Knotengruppe wird der PredicateExpr [...] ausgewertet. Wenn PredicateExpr für diesen Knoten den Wert true ergibt, wird der Knoten in den neuen Knotensatz aufgenommen. Andernfalls ist es nicht enthalten.
contains('haystack', 'needle')
gibt zurück, true
wenn haystack
enthält needle
:
Funktion: Boolescher Wert enthält (String, String)
Die Funktion enthält gibt true zurück, wenn die erste Argumentzeichenfolge die zweite Argumentzeichenfolge enthält, andernfalls false.
Nimmt contains()
aber einen String als ersten Parameter. Und es ist Knoten übergeben. Um damit umzugehen, wird jeder Knoten oder Knotensatz, der als erster Parameter übergeben wird , von der Funktion in einen String konvertiertstring()
:
Ein Argument wird wie durch Aufrufen der Zeichenfolgenfunktion in den Typ string konvertiert.
string()
Funktionsrückgabe string-value
des ersten Knotens :
Ein Knotensatz wird in eine Zeichenfolge konvertiert, indem der Zeichenfolgenwert des Knotens in dem Knotensatz zurückgegeben wird, der zuerst in der Dokumentreihenfolge steht. Wenn der Knotensatz leer ist, wird eine leere Zeichenfolge zurückgegeben.
string-value
eines Elementknotens :
Der Zeichenfolgenwert eines Elementknotens ist die Verkettung der Zeichenfolgenwerte aller Textknotennachkommen des Elementknotens in Dokumentreihenfolge.
string-value
eines Textknotens :
Der Zeichenfolgenwert eines Textknotens sind die Zeichendaten.
Grundsätzlich string-value
handelt es sich also um den gesamten Text, der in einem Knoten enthalten ist (Verkettung aller untergeordneten Textknoten).
text()
ist ein Knotentest, der mit jedem Textknoten übereinstimmt:
Der Knotentesttext () gilt für jeden Textknoten. Beispielsweise wählt child :: text () die untergeordneten Textknoten des Kontextknotens aus.
Dies //*[contains(text(), 'ABC')]
entspricht jedoch jedem Element (außer dem Wurzelknoten), dessen erster Textknoten enthält ABC
. Since text()
gibt einen Knotensatz zurück, der alle untergeordneten Textknoten des Kontextknotens enthält (relativ zu dem ein Ausdruck ausgewertet wird). Nimmt contains()
aber nur den ersten. Für das Dokument oben entspricht der Pfad dem Street
Element.
Der folgende Ausdruck //*[text()[contains(., 'ABC')]]
entspricht jedem Element (außer dem Stammknoten), das mindestens einen untergeordneten Textknoten enthält ABC
. .
repräsentiert den Kontextknoten. In diesem Fall handelt es sich um einen untergeordneten Textknoten eines Elements außer dem Stammknoten. Für das Dokument oben entspricht der Pfad also Street
den Comment
Elementen und.
Entspricht nun //*[contains(., 'ABC')]
jedem Element (außer dem Stammknoten), das enthält ABC
(in der Verkettung der untergeordneten Textknoten). Für das obige Dokument entspricht es den Home
, den Addr
, den Street
und den Comment
Elementen. Entspricht als solches //*[contains(., 'BLAH ABC')]
den Home
, den Addr
und den Comment
Elementen.
//*[contains(text(),'ABC')]
nur das<Street>
Element zurückgegeben. Es werden keine Vorfahren von<Street>
oder zurückgegeben<Comment>
.