text()
文字列と同等と考えるのは良い習慣ではありません。それらは文字列ではなく、文字列として原子化するノードです。それらを同じように扱うと、微妙で診断が難しいバグにつながる可能性があります。より良い定式化は次のとおりです。
let $s := ('foo', 'bar')
for $d in collection('mycollection')
where $d/Id/fn:string() = $s
return <p>{$d/Name} ({$d/Id})</p>
そうは言っても、text() ノードは文字列として原子化され、要素はその子の連結値として原子化されるため、通常 (要素に単純なテキスト コンテンツがある場合)、単純に要素を文字列 (または文字列のシーケンス) と比較できます。
let $s := ('foo', 'bar')
for $d in collection('mycollection')
where $d/Id = $s
return <p>{$d/Name} ({$d/Id})</p>
もう 1 つの適切な方法は、選択基準を節for
ではなく式に配置することです。where
多くの場合、これにより意図がより明確になりますが、さらに重要なことに、プロセッサの最適化が容易になります。例えば
let $s := ('foo', 'bar')
for $d in collection('mycollection')[Id = $s]
return <p>{$d/Name} ({$d/Id})</p>
これは単純で表現力が高いだけでなく、MarkLogic のようなプロセッサcollection('mycollection')[Id = $s]
は効率的なxdml:element-value-query
. フォームを使用するwhere
と、コレクション内のすべてのドキュメントのブルート フォース チェックが行われる可能性があります。