Marklogic Content Pump и преобразование XSLT

Я использую MarkLogic Content Pump для приема XML-документов. Я хотел бы преобразовать эти xml-документы в процессе приема mlcp, используя параметр «-tranform module и -transform namespace». Я уже создал 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

Ниже выдается ошибка ERROR:

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" ниже будет выдана ошибка несоответствия параметров: я думаю, это связано с неправильным типом возвращаемого значения:

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)
};

person vish.Net    schedule 27.09.2015    source источник
comment
См. Ответ mflatscher. Transform_module запрашивает модуль xQuery .. Не XSLT. Однако внутри этого модуля вы можете использовать таблицу стилей.   -  person David Ennis    schedule 28.09.2015
comment
Я только что проверил, что всякий раз, когда я устанавливаю преобразование xls, marklogic автоматически создает эквивалентный файл xqy. Я попытался использовать этот файл .xqy для преобразования, но безуспешно. Выдает ошибку несоответствия параметров. .Xqy принимает параметры, и я не предоставляю никаких параметров при преобразовании содержимого.   -  person vish.Net    schedule 28.09.2015
comment
Я никогда не слышал о том, чтобы для этой цели автоматически создавался какой-либо файл. Ссылка в другом комментарии показывает фактическую страницу руководства для пользовательских преобразований. Не могли бы вы опубликовать содержание этого файла xQuery, который, по вашему мнению, был создан?   -  person David Ennis    schedule 28.09.2015
comment
Я обновил вопрос. Похоже, что MarkLogic всегда выполняет xslt в контексте xquery.   -  person vish.Net    schedule 29.09.2015


Ответы (1)


Я не думаю, что вы можете указать -transform_module Content Pump непосредственно на XSLT. Я думаю, он ожидает модуль xQuery (см. https://docs.marklogic.com/guide/ingestion/content-pump#id_82518).

Вы должны иметь возможность настроить такой настраиваемый модуль преобразования xQuery и вызывать свое преобразование XSLT оттуда через xdmp: xslt-invoke () на карте $ content, которую передает Content Pump (см. http://docs.marklogic.com/xdmp:xslt-invoke). Затем вы должны установить -transform_module, чтобы он указывал на этот настраиваемый модуль передачи xQuery, а не напрямую вызывать преобразование XSL.

Обратите внимание, что если вы используете агрегаты -input_file_type, как в вашем примере, ваше настраиваемое преобразование будет применяться к каждому фрагменту, как определено для $ splittag. Таким образом, входящая карта $ content будет фрагментом, который вы разделяете (и преобразуете).

person Markus Flatscher    schedule 27.09.2015
comment
Я поставил плюс-1, потому что вы не только ответили на вопрос, но и расширили ответ, чтобы охватить некоторые важные детали использования MLCP. По какой-то причине кто-то отклонил ваш ответ, не удосужившись оставить комментарий о том, почему ... - person David Ennis; 28.09.2015