Marklogic 如何在文件系统中将文档保存为单个 xml

Marklogic How to save documents into single xml in file system

Qconsole return 多个文档节点。但不知道如何将文件系统中的所有文档节点保存到单个 xml 文件中。我不知道为什么它只保存最后一个文件。 ;-(( 提前致谢。

我的示例源代码。

(:validate condition and concate values:)
declare function local:ifx($mnem,$val) as node()* {
   if(fn:exists($val)) 
   then xdmp:value(fn:concat("<meta name=""{$mnem}"" content=""",$val,""" />")) 
else ()
};

(:Loop and concat values:)
declare function local:forx($mnem,$vals) as node()* {
   for $val in $vals
       return xdmp:value(fn:concat("<meta name=""{$mnem}"" content=""",$val,""" />"))
};


declare function local:ETL($nodes as node()*) as node()*{

  for $n in $nodes
      let $v_id := $n/rec:record/meta:Metadata/meta:id
      let $v_ba := for $elem in $n/rec:record/meta:Metadata/meta:fundingSource
                      return if (fn:string-length($elem/meta:BugetCode/meta:code)= 1)
                            then fn:concat("0",$elem/meta:BugetCode/meta:code)
                            else $elem/meta:BugetCode/meta:code
  return
     <record url="dbfeed.iadb" mimetype="text/html" last-modified="NA">
          <metadata>
              {local:ifx("id",$v_id)}
              {local:forx("ba",$v_ba)}
          </metadata> 
      </record>
     )

};

(:find all documents within a year:)
let $docs := cts:search(
fn:doc(),
    cts:and-query((
                  cts:element-value-query(xs:QName("meta:Collection"),"EDS"),
                  cts:field-range-query("rd",">=","2016-01-01"),
                  cts:field-range-query("rd","<","2017-01-01")
                  ))
)

let $XML2016 :=
       for $i in (local:uredetl($docs))
       return $i

 return xdmp:save("/output/all-data-2016.xml") ,$XML2016) 

变量 $XML2016 有一个项目序列,但是 xdmp:save() 的第二个参数需要单个 node().

在 MarkLogic 中,当您的 XQuery 版本声明为 1.0-ml 时,默认启用 function mapping。这意味着将为序列中的每个文档调用一次 xdmp:save() 函数。在所有这些保存之后,最后一个文档是您唯一看到的。

如果您禁用函数映射:

declare option xdmp:mapping "false";

然后执行你的代码,会抛出一个 XDMP-ARGTYPE 错误,抱怨你为 xdmp:save() 函数提供了一系列节点。

如果您有多个项目要保存到同一个文件中,您需要先将它们组合起来,然后使用单个节点调用保存一次,或者使用各自不同的文件名保存每个项目,或者查看改为使用 zip:create()