XSLT: установить имя преобразованного выходного файла

1

Я использую 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

Теги:
xslt-2.0
saxon
apache-camel

1 ответ

1
Лучший ответ

Похоже, что по умолчанию для 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 для динамического определения имен файлов. В ссылках есть несколько примеров.

  • 0
    Ну, это работает, +1 для деталей, и я отмечу это как ответ в ближайшее время. Я пытаюсь понять, как дать динамическое значение имени файла. Это значение получается с помощью обработки выражения xpath из входного файла.
  • 0
    Я попробовал это, и это работает, `<to uri =" file: {{outputfilefolder}}? FileName = $ simple {date: now: yyyyMMdd} .xml "/>`, но я смотрю на имя, которое извлекается используя xpath.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню