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()
。
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()
。