Я использую Apache Camel file
компонента и xslt
компонент. У меня есть маршрут, где я беру сообщение xml, преобразовываю с помощью xslt и перехожу в другую папку.
Apache camel DSL маршрут:
<route id="normal-route">
<from uri="file:{{inputfilefolder}}?consumer.delay=5000" />
<to uri="xslt:stylesheets/simpletransform.xsl transformerFactoryClass=net.sf.saxon.TransformerFactoryImpl" />
<to uri="file:{{outputfilefolder}}" />
</route>
Здесь также упоминается верблюд Apache, чтобы проверить, есть ли способ установить имя выходного файла с помощью Camel. Я думаю, даже без Camel, будет механизм с чистым XSLT.
Мне нужно переименовать преобразованный выходной файл. Но всегда я получаю одно и то же имя входного файла с преобразованным контентом в выходной папке.
например: входной файл: books.xml
выходной файл: books.xml
[с примененным преобразованием]
То, что я ищу, - someotherfilename.xml в качестве выходного имени файла. Выходные данные верны.
Я пробовал <xsl:result-document href="{title}.xml">
, но тогда выходной XML-код пуст. Пожалуйста помоги.
Входной файл XML:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book.child.1>
<title>Charithram</title>
<author>P Sudarsanan</author>
</book.child.1>
<book.child.2>
<title>Java Concurrency</title>
<author>Joshua Bloch</author>
</book.child.2>
</books>
XSLT:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes" />
<xsl:variable name="filename" select="'newfilename'" />
<xsl:template match="/">
<xsl:result-document href="{$filename}.xml">
<traders>
<xsl:for-each select="books/*">
<trade>
<title>
<xsl:value-of select="title" />
</title>
</trade>
</xsl:for-each>
</traders>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
Вывод XML при использовании <xsl:result-document href=""
в XSLT
это пусто..
Вывод XML, когда не используется <xsl:result-document href=""
в XSLT
<?xml version="1.0" encoding="UTF-8"?>
<traders xmlns:xs="http://www.w3.org/2001/XMLSchema">
<trade>
<title>Charithram</title>
</trade>
<trade>
<title>Java Concurrency</title>
</trade>
</traders>
Изменение: отредактировал XSLT в соответствии с комментарием MartinHonnen
Похоже, что по умолчанию для Camel используется одно имя файла, но вы можете его переопределить. Как указано в документах, вы можете указать интересующие параметры следующим образом:
file:directoryName[?options]
Одним из таких параметров является fileName
:
Используйте выражение, например "Язык файла", чтобы динамически установить имя файла. Для потребителей он используется как фильтр имен файлов. Для производителей он используется для оценки имени файла для записи.
Короче говоря, измените свой маршрут следующим образом:
<route id="normal-route">
<from uri="file:{{inputfilefolder}}?consumer.delay=5000" />
<to uri="xslt:stylesheets/simpletransform.xsl transformerFactoryClass=net.sf.saxon.TransformerFactoryImpl" />
<to uri="file:{{outputfilefolder}}?fileName=foo.xml" />
</route>
Где foo.xml
будет выходным файлом.
Обновить
Вы можете использовать Simple или File language для динамического определения имен файлов. В ссылках есть несколько примеров.