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

3

我正在使用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 [应用了转换]
我要寻找的是其他文件名作为输出文件名。输出数据是正确的。
我尝试过<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
你想创建一个单一的结果文档还是多个文档?你尝试使用 <xsl:template match="/"><xsl:result-document href="{title}.xml"> 创建一个名为 .xml 的文件,因为文档节点没有名为 title 的子元素,所以 {title} 的值为空字符串。 - Martin Honnen
感谢@MartinHonnen指出,我已经更新了代码引用有效值。但是,无论如何,这都不会影响输出文件名。在我的更改之前和之后,输出文件名仍然是“books.xml”。我想创建一个单一的输出文档,即转换后的XML。 - spiderman
我认为 <xsl:result-document href="{$filename}.xml"> 在 XSLT 2.0 方面是可以的,除非你没有运行 Saxon 或者在你的环境中结果文档被处理方式不同。我对 Apache Camel 没有任何了解,所以无法提供帮助。 - Martin Honnen
1个回答

3

看起来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是输出文件的名称。

更新

您可以使用SimpleFile语言动态设置文件名。链接中有一些示例。


好的,这个方法可行,感谢提供细节,我很快会将其标记为答案。我正在尝试理解如何给文件名赋予动态值。这个值是通过对输入文件进行xpath表达式处理获得的。 - spiderman
我尝试了这个,它可以工作:<to uri="file:{{outputfilefolder}}?fileName=$simple{date:now:yyyyMMdd}.xml" />,但我想要使用xpath提取的名称来命名。 - spiderman
1
另一种动态文件名的方法是将标题键设置为CamelXsltFileName,值设置为文件名,并将output=file作为参数传递给xslt:component。我会将其更新为另一个答案。 - spiderman
@spiderman,你能动态设置输出文件名吗? - Krishna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接