次の表現は何ですか?という質問にすばやく答えてみてください:
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)
この関数は、定義により、同じノードに対して同じ結果を返します。 関数の結果が等しい場合、ソースノードは同一です。
コメントや追加は大歓迎です。