一方では、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)
この関数は、定義により、同じノードに対して同じ結果を返します。 関数の結果が等しい場合、ソースノードは同一です。
コメントや追加は大歓迎です。