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
表单可能会导致对集合中的每个文档进行暴力检查。