Верблюд с XSLT 2.0 и xsl: документ результата, сохраняющий файлы в месте назначения маршрута - PullRequest
2 голосов
/ 14 марта 2019

Я пытаюсь использовать преобразование XSLT 2.0, чтобы разделить XML-файл на более мелкие файлы на основе групп элементов.Для выполнения преобразования я использую верблюжий маршрут.Моя проблема заключается в том, что при выполнении преобразования xslt полученные файлы сохраняются «вне» маршрута.

Так, например, учитывая следующий верблюжий маршрут:

from("{{input.endpoint}}")
.to("xslt:xslts/ics/MappingMapTostudents.xslt?saxon=true")
.to("{{output.endpoint}}");

Я был быожидая, что полученные XML-файлы будут созданы в папке {output.endpoint}.К сожалению, saxon сохраняет файлы в корневой папке, где находится исполняемый файл (верблюжье приложение).Как я могу сохранить файлы в {{output.endpoint}} или лучше, передать в следующую конечную точку?

В соответствии с примером XML:

<?xml version="1.0" encoding="UTF-8"?>
<class> 
    <students>
        <student>
            <firstname>Albert</firstname> 
            <group>A</group>
        </student> 
        <student> 
            <firstname>Isaac</firstname> 
            <group>A</group>
        </student> 
        <student> 
            <firstname>Leonardo</firstname> 
            <group>B</group>
        </student> 
        <student>
            <firstname>Enrico</firstname> 
            <group>B</group>
        </student> 
        <student> 
            <firstname>Marie</firstname> 
            <group>C</group>
        </student> 
        <student> 
            <firstname>Rosalind</firstname> 
            <group>C</group>
        </student>
        <student> 
            <firstname>Ada</firstname> 
            <group>D</group>
        </student>
    </students>
</class>

Преобразование XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:grp="http://www.altova.com/Mapforce/grouping" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="grp xs fn">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:function name="grp:var2_function">
        <xsl:param name="var1_param" as="node()"/>
        <xsl:for-each select="$var1_param/student">
            <xsl:sequence select="fn:string(group)"/>
        </xsl:for-each>
    </xsl:function>
    <xsl:template match="/">
        <xsl:for-each-group select="class/students" group-by="grp:var2_function(.)">
            <xsl:variable name="var3_resultof_grouping_key" as="xs:string" select="current-grouping-key()"/>
            <xsl:result-document href="{fn:concat($var3_resultof_grouping_key, '.xml ')}" encoding="UTF-8">
                <class>
                    <xsl:for-each select="(current-group()/student)[(fn:string(group) = $var3_resultof_grouping_key)]">
                        <students>
                            <student>
                                <firstname>
                                    <xsl:sequence select="fn:string(firstname)"/>
                                </firstname>
                                <group>
                                    <xsl:sequence select="$var3_resultof_grouping_key"/>
                                </group>
                            </student>
                        </students>
                    </xsl:for-each>
                </class>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Вы можете попытаться форсировать вывод типа "файл".

to("xslt:xslts/ics/MappingMapTostudents.xslt?saxon=true&output=file")

Затем, как объясняет документ, вы должны заполнить заголовок Camel требуемым путем к целевому файлу:

Для file необходимо указать имя файла в заголовке IN с ключом Exchange.XSLT_FILE_NAME, который также является CamelXsltFileName. Также любые пути, ведущие к имени файла, должны быть созданы заранее, в противном случае возникает исключение во время выполнения.

Удачи

0 голосов
/ 14 марта 2019

Я очень мало знаю об Apache-Camel, и, к сожалению, вопросы о технологии в StackOverflow, похоже, не имеют очень высокого показателя успеха.

Документация по http://camel.apache.org/xslt.html не дает никакой подсказкио том, как установить базовый выходной URI, который используется Saxon для разрешения любого относительного URI, появляющегося в xsl:result-document/@href.

. Самый простой подход, который приходит на ум, - передать параметр преобразованию, значение которого равноабсолютный путь к выходному каталогу:

<xsl:param name="outDir" as="xs:string"/>
...
<xsl:result-document 
   href="file:///{$outDir}{$var3_resultof_grouping_key}.xml"/>

Но кто-то, кто знает Apache Camel, может предложить более элегантное решение.

...