Marklogic如何在xml中排除多个节点

时间:2018-11-09 19:43:30

标签: marklogic

在元素中排除多个节点(例如“源”和“导航器”节点)时,我会遇到语法错误。但是,如果我只排除一个节点但在返回文档之前不进行合并,那么它是可行的。

[(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

2 个答案:

答案 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!