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)

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

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

Source: https://habr.com/ru/post/J70181/


All Articles