是否可以使用xquery搜索exists-db中的关键字?
我尝试过使用
//foo//@val[. &= $param]
但是这会返回错误,因为我的版本的exists-db(1.4.2)不支持
在多个节点上进行搜索的最佳方法是什么?
<xml>
<foo @val='test1'>
<bar @val='test2'>
<thunk @val='test3'/>
</bar>
</foo>
因此,使用我的示例XML,我该怎么做
let $result :=
if //xml/foo[contains(@val,$param)] or
//xml/foo/bar[contains(@val,$param)] or
//xml/foo/bar/thunk[contains(@val,$param)]
return $result
答案 0 :(得分:1)
其中任何一个都应该有效:
//foo//@val[contains(.,$param)]
//foo//@val[. eq $param]
但是,使用contains()而不是equals时,显然需要考虑一些问题。此外,如果您的示例中描述的路径将始终受到限制,并且您只是检查是否有任何一个是真的(而不是实际获取所有元素),那么这应该是一个更快,更有效的查询:
((//xml/foo[@val eq $param])[1] or (//xml/foo/bar[@val eq $param])[1] or (//xml/foo/bar/thunk[@val eq $param])[1])
未经测试,但是[1]
应该在从查询中获得第一个结果后使xpath求值程序短路,并且当它们中的任何一个返回值时,OR应该使表达式短路。