2011-01-07 1 views
21

XML 문서 :XPath 연산자 "! =". 어떻게 작동합니까?

<doc> 
    <A> 
     <Node>Hello!</Node> 
    </A> 

    <B>  
     <Node/> 
    </B> 

    <C> 
    </C> 

    <D/> 
</doc> 

에 대해 다음 XPath 쿼리를 평가하는 것?

/doc/A/Node != 'abcd' 
/doc/B/Node != 'abcd' 
/doc/C/Node != 'abcd' 
/doc/D/Node != 'abcd' 

나는 사실로 평가하는 이들의 모든을 기대.

/doc/A/Node != 'abcd'  true 
/doc/B/Node != 'abcd'  true 
/doc/C/Node != 'abcd'  false 
/doc/D/Node != 'abcd'  false 

이 예상되는 동작입니다 :

그러나, 여기에 결과는? 아니면 내 XPath 공급자 (jaxen)의 버그입니까? 에서

+0

좋은 질문, +1. 설명과 "반드시 기억해야 할"규칙과 해결책에 대한 내 대답을보십시오.:) –

답변

1

XPath spec : 비교하는 하나의 객체이다

경우 노드 설정하고 노드 -의 노드가있는 경우만 다른 문자열, 후 비교가 사실 일 것입니다 노드의 문자열 값과 다른 문자열에 대한 비교를 수행 한 결과가 참이되도록 설정하십시오.

이는 노드 집합 (귀하의 경우 C와 D에서와 같이) 비어있는 경우 불평등이 적용 할 수있는에 어떤 노드가 없기 때문에, 부울 식의 결과가 거짓을 의미합니다.

당신은이 문제를 해결하고이 같은 표현을 사용하여 원하는 결과를 얻을 수 있습니다 :

count(/doc/C/Node) = 0 or /doc/C/Node != 'abcd' 
+1

+1 사양 -1을 인용하는 것이 좋음 좋습니다에 대한 나쁜 ... –

42

추천를 하나 또는 두 인수는 노드 세트 어디에 불평등을 비교하기 위해 != 연산자를 사용하지 마십시오.

By definition : 문자열 값이 $value의 스트링 값과 같지 않은 것을 $node-set 같은 적어도 하나 개의 노드가 정확히

$node-set != $value 

true() 평가. 불평등이 보유하고있는 $empty-nodeset의 단일 노드도 없기 때문에

$empty-nodeset != $value 

는 항상 false()입니다 :이 정의를 사용

.

솔루션 :

사용 :을 원하는대로

not($node-set = $value) 

그런 다음 당신은 모든 결과 true()를 얻을.

+0

+1. 이 팁은 이미 저에게 많은 신경을 저장했습니다. – Flack

+0

+1 정확한 표현. –