如何使动态传递节点的cts:search代码正常运行?
动态传递节点到cts:search的解决方案
你的代码里/root/$node无法正常运行,因为$node是字符串类型,XPath不会自动把它解析成节点名称,而是会将其当作字符串进行匹配,导致路径查找失败。以下是几种可行的修复方案:
方案一:用
xdmp:eval动态构建路径
通过拼接字符串生成完整的XPath路径,再用xdmp:eval执行,让XPath动态识别节点名称:let $node := 'childnode' let $path := concat('/root/', $node) return cts:search(xdmp:eval($path), cts:and-query(( cts:collection-query('collection') )) )方案二:用
fn:resolve-QName转换节点名称
如果节点属于默认命名空间,可将字符串转成QName后,通过节点名称匹配定位目标节点:let $node := 'childnode' let $qname := fn:resolve-QName($node, /root) return cts:search(/root/*[node-name(.) = $qname], cts:and-query(( cts:collection-query('collection') )) )方案三:在查询条件中用
cts:element-query限定节点(推荐)
不修改cts:search的上下文路径,而是在查询逻辑里添加cts:element-query指定目标节点,这种方式更安全,也能更好地利用Mark索引,性能更优:let $node := 'childnode' return cts:search(/root, cts:and-query(( cts:collection-query('collection'), cts:element-query(xs:QName($node), cts:true-query()) )) )
内容的提问来源于stack exchange,提问作者anuj_gupta
相关产品推荐
相关产品推荐

