0
let $s := ('foo', 'bar')

for $d in collection('mycollection')
where ($d/Id/text() in $s)
return <p>{$d//Name} ({$d//Id})</p>

戻り値

[1.0-ml] XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected In_, expecting Comma_ or Rpar_ or SemiColon_

を指しています:

where ($d/Id/text() in $s)

ここで正しい構文は何ですか?

4

2 に答える 2

2

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と、コレクション内のすべてのドキュメントのブルート フォース チェックが行われる可能性があります。

于 2013-08-11T11:22:10.413 に答える
0

=演算子を使用する必要があります。

let $s := ('foo', 'bar')

for $d in collection('mycollection')
where $d/Id/text() = $s
return <p>{$d/Name} ({$d/Id})</p> 
于 2013-08-06T11:18:23.977 に答える