如何在导出文档时排除元素?

时间:2017-01-30 21:28:46

标签: marklogic

我在MarkLogic中存储了数千个XML文档。如何在instructorName中排除元素studentName$uris,然后保存到文件?

此代码将每个元素保存到文件中。我不想包含元素" instructorName"和#34; studentName"保存到xml文件中。

let $uris :=
  cts:uris(
    (),
    ("descending"),
    cts:and-query((
        cts:collection-query(("/courses")),
        cts:element-value-query(
          xs:QName("note"), "COGNITIVE   SCIENCE", "case-insensitive")
    ))
  )
for $uri in $uris
let $doc := fn:doc($uri)
let $courseID := fn:data($doc//meta:courseid)
return xdmp:save(fn:concat("/output/",$courseID,".xml"), $doc)

提前致谢 Thichxai

2 个答案:

答案 0 :(得分:1)

您应该只使用cts:search()来获取与查询匹配的文档,而不是使用cts:uris()后跟fn:doc():

http://docs.marklogic.com/cts:search

除此之外,我还不完全确定你要完成的两个目标中的哪一个。

如果要提取除这些元素以外的元素,请使用XPath。具体的XPath将取决于文档的结构,但假设这些是顶级子元素,则该方法类似于:

for $doc in cts:search(...)
let $root := $doc/*
let $hide := $root/(instructorName|studentName)
let $keep := ($root/node() except $hide)
let $newDoc := document-node{element {node-name($root)} {$keep}}
return xdmp:save(..., $newDoc)

如果要隐藏包含这些元素的文档,请尝试将查询更改为:

cts:and-query((
    cts:collection-query("/courses"),
    cts:not-query(
        cts:element-query(
            (xs:QName("instructorName"), xs:QName("studentName")),
            cts:true-query()
            ))
    ))

有关更多信息,请参阅:

http://docs.marklogic.com/cts:not-query

希望有帮助,

答案 1 :(得分:1)

即将推出的MarkLogic 9具有元素级安全性,我认为可以解决这个问题。 This article描述了它的工作原理。

您需要创建一个对整个文档具有读权限的用户,但不能创建对instructorName / studentName XPath的读权限。然后以该用户身份运行MLCP以将文档转储到文件中。