Frage

I am using Apache Camel file component and xslt component. I have a route where i pickup a xml message, transform using xslt and drop to a different folder.

Apache camel DSL route:

<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>

I am mentioning Apache camel also here , to check if there is a way to set the output file name using Camel. I think, even without Camel, there would be a mechanism with pure XSLT.

I need to rename the transformed output file. But always i am getting the same input filename with the transformed content, in the output folder.

eg: input file: books.xml output file: books.xml [with the transformation applied]

What i am looking for is someotherfilename.xml as the output filename. The output data is correct.

I tried <xsl:result-document href="{title}.xml"> , but then the output xml is blank. Please help.

Input XML file:

<?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>

Output XML when using <xsl:result-document href="" in XSLT

it is blank..

Output XML when not using <xsl:result-document href="" in 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>

Edit: edited the XSLT as per MartinHonnen's comment

War es hilfreich?

Lösung

Looks like Camel's default is to use the same file name, but you can override it. As the docs mention you can specify the options of interest as follows:

file:directoryName[?options]

One such option is fileName:

Use Expression such as File Language to dynamically set the filename. For consumers, it's used as a filename filter. For producers, it's used to evaluate the filename to write.

In short, modify your route as follows:

<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>

Where foo.xml will be the output file.

Update

You can use Simple or File language to set file names dynamically. There are a few examples in the links.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top