如何在导出文档时排除元素?
How to exclude elements while exporting documents?
我有数千个 XML 文档存储在 MarkLogic 中。如何在 $uris
中排除元素 instructorName
和 studentName
然后保存到文件?
此代码将每个元素保存到文件中。我不想包含要保存到 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 作为该用户将文档转储到文件。
我有数千个 XML 文档存储在 MarkLogic 中。如何在 $uris
中排除元素 instructorName
和 studentName
然后保存到文件?
此代码将每个元素保存到文件中。我不想包含要保存到 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 作为该用户将文档转储到文件。