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

How to exclude elements while exporting documents?

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

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

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

与其使用 cts:uris() 后接 fn:doc(),不如使用 cts:search() 一次性获取与查询匹配的文档:

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

除此之外,我不完全确定您要实现的两个目标中的哪一个。

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

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

希望对您有所帮助,

即将推出的 MarkLogic 9 具有 element-level 安全性,我认为这可以解决这个问题。 This article 描述了它是如何工作的。

您希望创建一个用户,该用户对整个文档具有 read-privileges,但对 instructorName/studentName XPath 不具有。然后 运行 MLCP 作为该用户将文档转储到文件。