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")) 应该会如您所愿地工作。