2011-01-07 13 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' 

私は、これらのALLに評価することが期待されます。

しかし、ここでの結果は以下のとおりです。

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

は、この予想される動作ですか?それとも、XPathプロバイダ(jaxen)のバグですか? XPath specから

+0

良い質問、+1説明と "覚えておく必要がある"ルールと解決策については私の答えを参照してください。:) –

答えて

1

比較される1つの目的は、ノードセットであり、他方が文字列である場合、比較はリンパ節転移にノードが存在する場合にのみ真となりノードの文字列値と他の文字列との比較を行った結果が真となるように設定する。

これは、ノードセットが空の場合(あなたのケースCとDのように)、不等式が適用できるノードがないため、ブール式の結果が偽になることを意味します。

あなたはこの現象を回避し、あなたのような表現を使って欲しい結果を得ることができます。

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

+1仕様-1を引用するのに適しています。推奨していません... –

42

勧告:一方または両方の引数がノード集合どこ不平等を比較する!=演算子を使用することはありませんが。

By definition

$node-set != $value 

その文字列値が$valueの文字列値と等しくないよう$node-set内の少なくとも1つのノードがある場合、正確true()に評価。この定義使用

:不等式が成立するために$empty-nodesetでも、単一のノードがないため

$empty-nodeset != $value 

は、常にfalse()です。

ソリューション

使用

not($node-set = $value) 

が望んでいたとして、あなたは、すべての結果true()を取得します。

+0

+1。このヒントはすでに私に多くの神経を救った。 – Flack

+0

+1正しい式。 –