2015-09-30 4 views
1

Это второй вопрос, связанный с утилитой MarkLogic content pump.Marklogic Content Pump создает несколько документов с помощью преобразования XSLT

Я глотаю единый агрегированный XML-документ с несколькими записями в насосе MarkLogic Content. Я ожидаю, что совокупный XML-документ будет преобразован в другой формат, а также утилиту накачки содержимого для создания нескольких XML-документов из одного большого XML-документа ввода.

Пример: Сводные входной XML-документ:

<root> 
<data>Bob</data> 
<data>Vishal></data> 
</root> 

Ожидаемый результат от содержания насоса: два документа с другой формат:

документ 1:

<data1>Bob</data1> 

документ 2

<data1>Vishal</data1> 

Я использую следующий XSLT разделить вышеуказанный документ на два узла:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 
    <xsl:template match="root"> 
    <xsl:apply-templates select="data"></xsl:apply-templates> 
    </xsl:template> 
    <xsl:template match="data"> 
    <data1><xsl:value-of select="."/></data1> 
    </xsl:template> 
</xsl:stylesheet> 

выход:

<?xml version="1.0" encoding="UTF-8"?> 
<data1>Bob</data1> 
<data1>Vishal</data1> 

Ниже приводится преобразование XQuery, который вызывает над «XSLT-файла» для создания двух узлов :

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) 

}; 

Приведенные выше преобразования XQuery не удались и возвратили ошибку. Итак, как мне изменить вышеупомянутую программу XQuery, чтобы она генерировала и индексировала несколько преобразованных XML-документов из одного документа?

МЛКП Команда:

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 

ответ

3

Преобразование вы предоставили возвращает один документ, содержащий несколько элементов корня. Трансформация будет работать, но MarkLogic не позволит вставить ее в базу данных и выбросить XDMP-MULTIROOT: Document nodes cannot have multiple roots.

Существует два способа решить это. Самое простое - использовать /* за xdmp:xslt-invoke. Другое решение - использовать <xsl:result-document href="{generate-id()}.xml"> внутри вашего XSLT. Оба будут приводить к тому, что $let-output будет содержать последовательность, а не только один документ.

Однако без дальнейших изменений, которые приведут к XDMP-CONFLICTINGUPDATES, так как это приведет к записи нескольких результатов в одной базе данных uri. Чтобы решить эту проблему, вы можете клонировать $content map:map с небольшим трюком и предоставить отдельный uris.Например, как это:

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 

Примечание: функция преобразования имеет тип возвращаемого map:map*, то есть вы можете вернуть ноль или более карты: содержащий результат открытой карты.

HTH!

+0

Большое спасибо. Это спасатель жизни. Пожалуйста, продолжайте помогать –

1

Вы не можете использовать функцию преобразования, чтобы фактически разделить ваш документ. Вместо этого это называется за каждый документ, принимаемый.

Создание отдельных документов выполняется до проглатывания и контролируется флагами aggregate_.

https://docs.marklogic.com/guide/ingestion/content-pump#id_65814

+0

См. Ниже ссылку: https://docs.marklogic.com/guide/ingestion/content-pump#id_82518. Это ясно сказано ниже (но пример не указан): Создание настраиваемой трансформации Пользовательское преобразование - это функциональный модуль XQuery, который соответствует следующему интерфейсу. Ваша функция получает один входной документ, описываемый $ content, и может генерировать нулевые, одно или многие выходные документы. –

 Смежные вопросы

  • Нет связанных вопросов^_^