Question

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

Était-ce utile?

La solution

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top