第一部分,获取目录中的所有文档,已经为我们准备好了避免 XDMP-EXPNTREECACHEFULL 并加载文档 https://stackoverflow.com/questions/14679746/avoiding-xdmp-expntreecachefull-and-loading-document
cts:search(
collection(),
cts:directory-query('path/to/documents/', 'infinity'))
正如我的回答中所述,如果您需要进一步的限制,您可以cts:and-query
that cts:directory-query
和其他人cts:query
terms.
接下来,您需要将每个 XML 文档转换为 CSV。这相当简单,但您必须知道 XML 的结构或有某种方法来推断它。对于这个例子,我会说我总是有简单的子元素a
, b
, c
, d
在某些根元素下。因此,查询需要为这些元素生成 CSV 标头,后跟 CSV 行。
我们可能还想从调用者处提交目录 URI。如果您使用 REST 这将使用xdmp:get-request-field
但对于 XCC 来说它是一个外部值。
declare variable $DIRECTORY-URI as xs:string external ;
declare function local:csv($root as element()) as xs:string
{
string-join(($root/a, $root/b, $root/c, $root/d), ',')
};
'A,B,C,D',
cts:search(
collection(),
cts:directory-query($DIRECTORY-URI, 'infinity'))/local:csv(*)
再次,制作local:csv
为您的应用程序工作需要一些 XML 知识或某种推断其结构的方法。您可能还需要将一些值放在双引号中。但这种基本结构是解决该问题的最有效方法之一。我避免使用任何 XQuery FLWOR 表达式,以便结果可以流式传输。
另一种方法是使用范围索引和http://docs.marklogic.com/cts:值元组 http://docs.marklogic.com/cts:value-tuples with a cts:query
限制结果,然后将 JSON 转换为 CSV。这会更加有效,因为不会获取任何片段。但这不适用于某些 XML 结构,并且您可能无法为每个 CSV 字段创建范围索引。
declare variable $DIRECTORY-URI as xs:string external ;
declare function local:csv($ja as json:array) as xs:string
{
string-join(json:array-values($ja), ',')
};
'A,B,C,D',
local:csv(
cts:value-tuples(
(cts:element-reference(xs:QName('a')),
cts:element-reference(xs:QName('b')),
cts:element-reference(xs:QName('c')),
cts:element-reference(xs:QName('d'))),
(),
cts:directory-query($DIRECTORY-URI, 'infinity')))