XPathでの等式、不等式、ノードIDの確認

一方では、XPathは、すべてのプログラマーが使い慣れている比較演算子「等しい」、「等しくない」、「少ない」、「その他」などを使用します。 一方、これらの演算子はプリミティブ型だけでなく、ノードのセット全体でも機能します。 ノードのセットを比較するための規則を無視すると、いくつかの驚きにつながる可能性があります。



次の表現は何ですか?という質問にすばやく答えてみてください:



foo = 'bar' and foo != 'bar'







あなたの答えがfalse



場合、著者は提案します 読んでください。



ノードと文字列の比較



簡単なタスク: foo



属性が文字列'bar'



と等しいかどうかを確認し'bar'







@foo = 'bar'







逆問題を解くと、次のコードがよく表示されます。



@foo != 'bar'







ほとんどの場合、このコードは期待どおりに機能します。 ただし、 foo



属性が存在しない場合、この式はfalse



返しfalse



。 ドキュメントを注意深く読み、 @foo != 'bar'



をロシア語に翻訳すると、次のようになります: 'bar'



と等しくない 属性 foo



少なくとも1つありますfoo



属性が存在しない場合、条件は満たされないため、 false



です。



問題の正しい解決策:



not(@foo = 'bar')







ロシア語への翻訳では、 'bar'



等しい 属性 foo



はありません



一連のノードと文字列の比較



次の文書を入手してください。

<list>

<item>foo</item>

<item>bar</item>

<item>baz</item>

</list>








等式、不等式、否定の演算子のさまざまな組み合わせを適用します。

表現 翻訳 結果
item = 'foo'



'foo'



等しい要素が少なくとも1つあります。
true



item != 'bar'



'bar'



と等しくない要素が少なくとも1つあり'bar'



true



not(item = 'foo')



'foo'



等しい要素はありません。
false



not(item != 'baz')



利用可能なすべてのアイテムは'baz'



と同じです。
false



ご覧のとおり、式item = 'foo' and item != 'foo'



true



返すtrue



、状況は可能true







ノードID検証



2つのノードを比較すると、それらは文字列にキャストされます。 文字列表現の一致ではなく、同一性を確認する必要がある場合はどうすればよいですか? つまり、テスト対象の2つのノードが同じノードであることを確立する必要があります。 このようなタスクは、たとえば、 ミュンヘンのグループ化で発生します



最初の解決策は、純粋なXPathにあります。



count($foo | $bar) = 1







この式は、 ユニオン演算子のプロパティを使用します。これは、同じノードが操作の結果を2回入力できないという事実に基づいています。 結果が単一ノードの場合、ソースノードは同一です。



2番目のソリューションでは、 generate-id XSLT関数を使用します。



generate-id($foo) = generate-id($bar)







この関数は、定義により、同じノードに対して同じ結果を返します。 関数の結果が等しい場合、ソースノードは同一です。



コメントや追加は大歓迎です。



All Articles