XSLT:设置已转换输出文件的名称

时间:2014-03-19 20:03:52

标签: java apache-camel xslt-2.0 saxon

我正在使用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设置输出文件名。我想,即使没有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>

在XSLT中使用<xsl:result-document href=""时输出XML

它是空白的..

在XSLT中不使用<xsl:result-document href=""时输出XML

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

编辑:根据MartinHonnen的评论编辑XSLT

1 个答案:

答案 0 :(得分:1)

看起来Camel的默认设置是使用相同的文件名,但您可以覆盖它。正如docs提到的那样,您可以按如下方式指定感兴趣的选项:

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将成为输出文件。

<强>更新

您可以使用SimpleFile语言动态设置文件名。链接中有几个例子。