Marklogic如何将文档保存到文件系统中的单个xml中

Marklogic如何将文档保存到文件系统中的单个xml中,marklogic,Marklogic,Qconsole返回多个文档节点。但不知道如何将文件系统中的所有文档节点保存到单个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}

Qconsole返回多个文档节点。但不知道如何将文件系统中的所有文档节点保存到单个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) 
(:验证条件和具体值:)
将函数local:ifx($mnem,$val)声明为节点()*{
如果(fn:存在($val))
然后是xdmp:value(fn:concat(“”)
else()
};
(:循环和concat值:)
将函数local:forx($mnem,$vals)声明为节点()*{
以$val表示的$val
返回xdmp:value(fn:concat(“”)
};
将函数local:ETL($nodes as node()*)声明为node()*{
对于$n,在$nodes中
让$v_id:=$n/rec:record/meta:Metadata/meta:id
让$v_ba:=对于$n/rec:record/meta:Metadata/meta:fundingSource中的$elem
返回if(fn:字符串长度($elem/meta:BugetCode/meta:code)=1)
然后fn:concat(“0”,$elem/meta:BugetCode/meta:code)
else$elem/meta:BugetCode/meta:code
返回
{local:ifx(“id”,$v_id)}
{本地:forx(“ba”,v_ba)}
)
};
(:查找一年内的所有文档:)
让$docs:=cts:search(
fn:doc(),
cts:和查询((
cts:元素值查询(xs:QName(“meta:Collection”),“EDS”),
cts:字段范围查询(“rd”、“>=”、“2016-01-01”),

cts:字段范围查询(“rd”,“变量
$XML2016
有一个项目序列,但第二个参数需要一个
节点()

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

如果禁用了函数映射:

declare option xdmp:mapping "false";
然后执行代码,将抛出一个XDMP-ARGTYPE错误,抱怨您为
XDMP:save()
函数提供了一系列节点


如果有多个项目要保存到同一个文件中,则需要先将它们组合起来,然后使用单个节点调用save once,或者使用各自不同的文件名保存每个项目,或者可以使用另一个文件名。

或者,如果确实要从所有文档创建单个XML(如问题中所述),将$XML2016包装到包装元素中,该元素将文档节点序列转换为包含所有内容的单个元素节点。类似于:
element wrapper{$XML2016}