我在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
答案 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以将文档转储到文件中。