XML 문서 :
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
XPath 표현식 :
//*[contains(text(), 'ABC')]
//*
루트 노드 의 모든 하위 요소 와 일치 . 즉, 루트 노드 이외의 모든 요소입니다.
[...]
A는 술어 , 그것은 노드 집합을 필터링합니다. 하는 것은 노드를 반환하는 ...
것입니다 true
:
술어는 노드 세트 [...]를 필터링하여 새 노드 세트를 생성합니다. 필터링 된 노드 집합의 각 노드에 대해 PredicateExpr이 평가됩니다 [...]; PredicateExpr이 해당 노드에 대해 true로 평가되면 해당 노드는 새 노드 세트에 포함됩니다. 그렇지 않으면 포함되지 않습니다.
contains('haystack', 'needle')
포함하는true
경우를 반환 합니다 .haystack
needle
함수 : 부울 포함 (문자열, 문자열)
contains 함수는 첫 번째 인수 문자열에 두 번째 인수 문자열이 포함되어 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
그러나 contains()
문자열을 첫 번째 매개 변수로 사용합니다. 그리고 그것은 통과 된 노드입니다. 이를 처리하기 위해 첫 번째 매개 변수로 전달 된 모든 노드 또는 노드 세트 가 함수에 의해 문자열로 변환 됩니다 string()
.
문자열 함수를 호출하여 인수가 문자열 유형으로 변환됩니다.
string()
첫 번째 노드string-value
의 함수 반환 :
노드 세트는 문서 순서에서 첫 번째 인 노드 세트에있는 노드의 문자열 값을 리턴하여 문자열로 변환됩니다. 노드 집합이 비어 있으면 빈 문자열이 반환됩니다.
string-value
의 요소 노드 :
요소 노드의 문자열 값은 문서 노드에서 요소 노드의 모든 텍스트 노드 자손의 문자열 값을 연결 한 것입니다.
string-value
(A)의 텍스트 노드 :
텍스트 노드의 문자열 값은 문자 데이터입니다.
따라서 기본적으로 string-value
노드에 포함 된 모든 텍스트 (모든 자손 텍스트 노드의 연결)입니다.
text()
모든 텍스트 노드와 일치하는 노드 테스트입니다.
모든 텍스트 노드에 대해 노드 테스트 text ()가 true입니다. 예를 들어 child :: text ()는 컨텍스트 노드의 텍스트 노드 자식을 선택합니다.
이 말을 //*[contains(text(), 'ABC')]
하면 첫 번째 텍스트 노드가 포함하는 모든 요소 (그러나 루트 노드)와 일치합니다 ABC
. text()
컨텍스트 노드의 모든 하위 텍스트 노드가 포함 된 노드 세트를 리턴 하므로 (표현식에 상대적) 그러나 contains()
첫 번째 것만 취합니다. 따라서 위의 문서의 경우 경로가 Street
요소 와 일치합니다 .
다음 표현식 //*[text()[contains(., 'ABC')]]
은 하나 이상의 하위 텍스트 노드가 있고을 포함하는 모든 요소 (그러나 루트 노드)와 일치합니다 ABC
. .
컨텍스트 노드를 나타냅니다. 이 경우 루트 노드를 제외한 모든 요소의 하위 텍스트 노드입니다. 위의 문서의 경우 경로는 Street
,Comment
요소 .
이제 하위 텍스트 노드의 연결에 //*[contains(., 'ABC')]
포함 된 모든 요소 (그러나 루트 노드)와 일치합니다 ABC
. 가 일치 위의 문서 Home
는 Addr
의 Street
, 그리고 Comment
요소를. 따라서, //*[contains(., 'BLAH ABC')]
성냥 Home
은 Addr
,와 Comment
요소를.
//*[contains(text(),'ABC')]
있는 한<Street>
요소 만 반환합니다 .<Street>
또는의 조상을 반환하지 않습니다<Comment>
.