在元素中排除多个节点(例如“源”和“导航器”节点)时,我会遇到语法错误。但是,如果我只排除一个节点但在返回文档之前不进行合并,那么它是可行的。
[(fn:local-name() != ("Sources","Navigators")]
在Marklogic Qconsole中:
for $x in $uris
let $doc := fn:doc($x)
let $copymeta := <meta:Metadata>
{ $doc//meta:Metadata/*[(fn:local-name() != ("Sources","Navigators")] }
</meta:Metadata>
let $newxml := <omd:record>
{ $copymeta }
</omd:record>
return $newxml
答案 0 :(得分:2)
!=
运算符具有不直观的语义。参见this previous question。当代码找到*:Sources节点时,其对“ Navigators”的评价为!=
,当找到*:Navigators节点时,其对“ Sources”的评价为!=
。然后,您将获得所有节点。
如果不比较节点序列(因此不能选择except
),则可以使用!=
代替fn:not(A = B)
以获得预期的效果。在这种情况下,fn:not(fn:local-name() = ("Sources","Navigators"))
应该可以正常工作。
答案 1 :(得分:1)
在fn:local-name()
前面您有一个太多的括号。
但是,您也可以使用except
关键字和前缀通配符。您将这样使用它:
for $x in $uris
let $doc := fn:doc($x)
let $copymeta := <meta:Metadata>
{ $doc//meta:Metadata/(* except (*:Sources, *:Navigators)) }
</meta:Metadata>
let $newxml := <omd:record>
{ $copymeta }
</omd:record>
return $newxml
HTH!