Marklogic Content Pump 和 XSLT 转换

Marklogic Content Pump and XSLT transformation

我正在使用 MarkLogic Content Pump 摄取 XML 文档。我想在 mlcp 摄取过程中使用“-tranform 模块和 -transform 命名空间”选项转换这些 xml 文档。我已经为转换创建了 XSLT,并将其加载到 ML“模块”数据库中。但是 mlcp 不接受 xslt 文件并抛出错误:

命令:

    mlcp.sh import \
-username $username -password $passwd \
-host $host -port $port \
-input_file_path $inpath \
-input_compressed true \
-input_file_type aggregates \
-aggregate_record_element $splittag \
-aggregate_uri_id $uriid \
-aggregate_record_namespace "http://www.fda.gov/cdrh/gudid" \
-output_collections $collection \
-output_permissions my-app-role,read,my-app-role,update \
-output_uri_suffix .xml \
-transform_module /marklogic.rest.transform/xml-transform-xsl/assets/transform.xsl \
-transform_namespace "http://marklogic.com/rest-api/transform/xml-transform-xsl" \
-transform_function transform

抛出以下错误 错误:

15/09/27 15:34:19 WARN mapreduce.ContentWriter: XDMP-MODNOTTEXT: Module /marklogic.rest.transform/fda-transform-xsl/assets/transform.xsl is not a text document

我想知道mlcp是否接受xslt转换?如果不能,那还有什么选择呢?

MarkLogic 在模块数据库中创建等效的 xqy 文件。通过调用下面的“.xqy”文件,将抛出参数不匹配错误:我认为这是由于错误的return类型:

xquery version "1.0-ml";
module namespace simple-xsl = "http://marklogic.com/rest-api/transform/simple-xsl";
import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util"
    at "/MarkLogic/rest-api/lib/extensions-util.xqy";
declare namespace xsl = "http://www.w3.org/1999/XSL/Transform";
declare default function namespace "http://www.w3.org/2005/xpath-functions";
declare option xdmp:mapping "false";
declare private variable $transform-uri := "/marklogic.rest.transform/fda-transform-xsl/assets/transform.xsl";
declare function fda-transform-xsl:transform(
    $context as map:map,
    $params  as map:map,
    $content as document-node()  
) as document-node()?
{
    extut:execute-transform($transform-uri,$context,$params,$content)
};

我认为您不能将 Content Pump 的 -transform_module 直接指向 XSLT。我认为它需要一个 xQuery 模块(参见 https://docs.marklogic.com/guide/ingestion/content-pump#id_82518)。

您应该能够设置这样一个自定义转换 xQuery 模块,并通过 Content Pump 传入的 $content 映射上的 xdmp:xslt-invoke() 从那里调用您的 XSLT 转换(参见http://docs.marklogic.com/xdmp:xslt-invoke)。然后,您可以将 -transform_module 设置为指向该自定义传输 xQuery 模块,而不是直接调用 XSL 转换。

请注意,如果您使用 -input_file_type 聚合,如您的示例所示,您的自定义转换将应用于每个 $splittag 定义的片段。因此传入的 $content 映射将是您要拆分(和转换)的片段。