Marklogic如何排除xml中的多个节点
Marklogic How to exclude multiple nodes in xml
在排除 "Sources" 和 "Navigators" 节点等元素中的多个节点时出现语法错误。但是如果我只排除一个节点但在返回文档之前不合并,它会起作用。
[(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
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!
!=
运算符语义不直观。参见 this previous question。当代码找到 *:Sources 节点时,它的计算结果为 !=
到 "Navigators",当它找到 *:Navigators 节点时,它的计算结果为 !=
到 "Sources"。然后你得到所有的节点。
如果您不比较节点序列(因此 except
不是一个选项),那么您可以使用 fn:not(A = B)
而不是 !=
来获得预期的效果。在这种情况下,fn:not(fn:local-name() = ("Sources","Navigators"))
应该会如您所愿地工作。
在排除 "Sources" 和 "Navigators" 节点等元素中的多个节点时出现语法错误。但是如果我只排除一个节点但在返回文档之前不合并,它会起作用。
[(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
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!
!=
运算符语义不直观。参见 this previous question。当代码找到 *:Sources 节点时,它的计算结果为 !=
到 "Navigators",当它找到 *:Navigators 节点时,它的计算结果为 !=
到 "Sources"。然后你得到所有的节点。
如果您不比较节点序列(因此 except
不是一个选项),那么您可以使用 fn:not(A = B)
而不是 !=
来获得预期的效果。在这种情况下,fn:not(fn:local-name() = ("Sources","Navigators"))
应该会如您所愿地工作。