Dokument XML:
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
Wyrażenie XPath:
//*[contains(text(), 'ABC')]
//*
pasuje do każdego potomka elementu z węzła głównego . Oznacza to, że każdy element oprócz węzła głównego.
[...]
jest predykatem , filtruje zestaw węzłów. Zwraca węzły, dla których ...
jest true
:
Predykat filtruje zestaw węzłów [...], aby utworzyć nowy zestaw węzłów. Dla każdego węzła w zestawie węzłów, który ma być filtrowany, PredicateExpr jest analizowany [...]; jeśli PredicateExpr ma wartość true dla tego węzła, węzeł jest zawarty w nowym zestawie węzłów; w przeciwnym razie nie zostanie uwzględnione.
contains('haystack', 'needle')
zwraca, true
jeśli haystack
zawiera needle
:
Funkcja: boolean zawiera (ciąg, ciąg)
Funkcja zawiera zwraca true, jeśli pierwszy ciąg argumentu zawiera drugi ciąg argumentu, a w przeciwnym razie zwraca false.
Ale contains()
jako pierwszy parametr przyjmuje ciąg. I to przeszedł węzły. Aby sobie z tym poradzić, każdy węzeł lub zestaw węzłów przekazany jako pierwszy parametr jest konwertowany na ciąg przez string()
funkcję:
Argument jest konwertowany na ciąg znaków, tak jakby wywoływał funkcję ciągu.
string()
funkcja zwraca string-value
z pierwszego węzła :
Zestaw węzłów jest konwertowany na ciąg znaków, zwracając wartość ciągu węzła w zestawie węzłów, który jest najpierw w kolejności dokumentów. Jeśli zestaw węzłów jest pusty, zwracany jest pusty ciąg.
string-value
o węzeł elementu :
Wartość ciągu węzła elementu jest konkatenacją wartości ciągu wszystkich potomków węzła tekstowego węzła elementu w kolejności dokumentów.
string-value
z węzła tekstowego :
Wartość ciągu tekstowego węzła to dane znakowe.
Zasadniczo string-value
jest to cały tekst zawarty w węźle (konkatenacja wszystkich potomnych węzłów tekstowych).
text()
to test węzła pasujący do dowolnego węzła tekstowego:
Test tekstowy węzła () jest prawdziwy dla każdego węzła tekstowego. Na przykład child :: text () wybierze dzieci węzła tekstowego węzła kontekstu.
Powiedziawszy to, //*[contains(text(), 'ABC')]
pasuje do dowolnego elementu (oprócz węzła głównego), którego pierwszy węzeł tekstowy zawiera ABC
. Ponieważ text()
zwraca zestaw węzłów, który zawiera wszystkie potomne węzły tekstowe węzła kontekstu (w odniesieniu do którego oceniane jest wyrażenie). Ale contains()
bierze tylko pierwszy. Tak więc dla dokumentu powyżej ścieżka pasuje do Street
elementu.
Poniższe wyrażenie //*[text()[contains(., 'ABC')]]
pasuje do dowolnego elementu (oprócz węzła głównego), który zawiera co najmniej jeden potomny węzeł tekstowy, który zawieraABC
. .
reprezentuje węzeł kontekstu. W tym przypadku jest to potomny węzeł tekstowy dowolnego elementu oprócz węzła głównego. Tak więc dla dokumentu powyżej ścieżka pasuje Street
do Comment
elementów i.
Teraz //*[contains(., 'ABC')]
dopasowuje dowolny element (oprócz węzła głównego), który zawiera ABC
(w konkatenacji potomnych węzłów tekstowych). Na dokumencie powyżej pasuje do Home
, na Addr
, na Street
, a Comment
elementy. Jako takie, //*[contains(., 'BLAH ABC')]
pasuje do Home
Z Addr
, a Comment
elementy.
//*[contains(text(),'ABC')]
zwraca tylko<Street>
element. Nie zwraca żadnych przodków<Street>
ani<Comment>
.