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