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> 

另一个好的做法是尽可能将选择标准放在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 回答