Marklogic内容泵通过XSLT转换生成多个文档

Marklogic内容泵通过XSLT转换生成多个文档,marklogic,marklogic-8,mlcp,Marklogic,Marklogic 8,Mlcp,这是与效用有关的第二个问题 我将一个包含多条记录的聚合XML文档摄取到MarkLogic内容泵中。我希望聚合XML文档转换为不同的格式,并且内容泵实用程序可以从单个输入的大型XML文档生成多个XML文档 示例:聚合输入xml文档: <root> <data>Bob</data> <data>Vishal></data> </root> 上述XQuery转换失败并返回错误。那么,如何修改上述XQuery程序,使其从

这是与效用有关的第二个问题

我将一个包含多条记录的聚合XML文档摄取到MarkLogic内容泵中。我希望聚合XML文档转换为不同的格式,并且内容泵实用程序可以从单个输入的大型XML文档生成多个XML文档

示例:聚合输入xml文档:

<root>
 <data>Bob</data>
 <data>Vishal></data>
</root>
上述XQuery转换失败并返回错误。那么,如何修改上述XQuery程序,使其从单个文档生成多个转换后的XML文档并为其编制索引呢

MLCP命令:

mlcp.sh import -host localhost -port 8040 \
    -username admin -password admin \
    -input_file_path ./parent-form.xml \
    -transform_module /example/parent-transform.xqy \
    -transform_namespace "http://marklogic.com/example" \
    -transform_param "my-value" \
    -output_collections people \
    -output_permissions my-app-role,read,my-app-role,update 

不能使用转换函数实际拆分文档。取而代之的是,每个被摄取的文档都被称为

单个文档的创建在摄取之前完成,并由聚合标志控制


您不能使用转换功能实际拆分文档。取而代之的是,每个被摄取的文档都被称为

单个文档的创建在摄取之前完成,并由聚合标志控制


您提供的转换返回包含多个根元素的单个文档。转换将起作用,但MarkLogic不允许将其插入数据库,并抛出
XDMP-MULTIROOT:Document节点不能有多个根

有两种方法可以解决这个问题。最简单的方法是在
xdmp:xslt调用
后面使用
/*
。另一种解决方案是在XSLT中使用
。两者都会导致
$let output
包含一个序列,而不仅仅是一个文档

但是,如果没有进一步的更改,将导致
XDMP-CONFLICTINGUPDATES
,因为这将在一个数据库uri中写入多个结果。为了解决这个问题,您可以用一个小技巧克隆
$content-map:map
,并提供单独的URI。例如:

for $let-output at $i in xdmp:xslt-invoke("/marklogic.rest.transform/simple-xsl/assets/transform.xsl", $the-doc )/*
let $extra-content := map:map(document{$content}/*)
let $_ := map:put($extra-content, "value", $let-output)
let $_ := map:put($extra-content, "uri", concat($the-uri, '-', $i, '.xml') )
return
  $extra-content
注意:transform函数的返回类型为
map:map*
,这意味着您可以返回零个或多个map:map的包含结果


您提供的转换返回包含多个根元素的单个文档。转换将起作用,但MarkLogic不允许将其插入数据库,并抛出
XDMP-MULTIROOT:Document节点不能有多个根

有两种方法可以解决这个问题。最简单的方法是在
xdmp:xslt调用
后面使用
/*
。另一种解决方案是在XSLT中使用
。两者都会导致
$let output
包含一个序列,而不仅仅是一个文档

但是,如果没有进一步的更改,将导致
XDMP-CONFLICTINGUPDATES
,因为这将在一个数据库uri中写入多个结果。为了解决这个问题,您可以用一个小技巧克隆
$content-map:map
,并提供单独的URI。例如:

for $let-output at $i in xdmp:xslt-invoke("/marklogic.rest.transform/simple-xsl/assets/transform.xsl", $the-doc )/*
let $extra-content := map:map(document{$content}/*)
let $_ := map:put($extra-content, "value", $let-output)
let $_ := map:put($extra-content, "uri", concat($the-uri, '-', $i, '.xml') )
return
  $extra-content
注意:transform函数的返回类型为
map:map*
,这意味着您可以返回零个或多个map:map的包含结果


请参阅以下链接:。下面明确说明(但未提供示例):创建自定义转换自定义转换是符合以下接口的XQuery功能模块。您的函数接收单个输入文档(由$content描述),可以生成零个、一个或多个输出文档。请参阅以下链接:。下面明确说明(但未提供示例):创建自定义转换自定义转换是符合以下接口的XQuery功能模块。您的函数只接收一个输入文档(用$content表示),可以生成零个、一个或多个输出文档。非常感谢。这是个救命稻草。请继续帮我谢谢你。这是个救命稻草。请继续帮忙
<?xml version="1.0" encoding="UTF-8"?>
<data1>Bob</data1>
<data1>Vishal</data1>
xquery version "1.0-ml";
module namespace example = "http://marklogic.com/example";

declare function example:transform(
  $content as map:map,
  $context as map:map
) as map:map*
{
  let $attr-value := 
    (map:get($context, "transform_param"), "UNDEFINED")[1]
  let $the-doc := map:get($content, "value")

  let $let-output:=  xdmp:xslt-invoke("/marklogic.rest.transform/simple-xsl/assets/transform.xsl", $the-doc )
  return (map:put(
          $content, "value",
          $let-output
        ),$content)

};
mlcp.sh import -host localhost -port 8040 \
    -username admin -password admin \
    -input_file_path ./parent-form.xml \
    -transform_module /example/parent-transform.xqy \
    -transform_namespace "http://marklogic.com/example" \
    -transform_param "my-value" \
    -output_collections people \
    -output_permissions my-app-role,read,my-app-role,update 
for $let-output at $i in xdmp:xslt-invoke("/marklogic.rest.transform/simple-xsl/assets/transform.xsl", $the-doc )/*
let $extra-content := map:map(document{$content}/*)
let $_ := map:put($extra-content, "value", $let-output)
let $_ := map:put($extra-content, "uri", concat($the-uri, '-', $i, '.xml') )
return
  $extra-content