使用ant在单个管道中的多个XSLT文件

时间:2012-10-18 19:34:05

标签: xslt ant

我有多个XSLT文件,我用它来处理管道中的源XML。我知道exsl:node-set的技巧,但在对这个工作流程有一些问题之后,我决定将各种传递拆分成单独的XSL文件。我现在对文件的结构更加满意,并且工作流程在Eclipse中运行良好。我们的发布系统适用于ant。我可以像这样处理文件:

<xslt basedir="src-xml" style="src-xml/preprocess_1.xsl" in="src-xml/original.xml" out="src-xml/temp_1.xml" />
<xslt basedir="src-xml" style="src-xml/preprocess_2.xsl" in="src-xml/temp_1.xml" out="src-xml/temp_2.xml" />
<xslt basedir="src-xml" style="src-xml/preprocess_3.xsl" in="src-xml/temp_2.xml" out="src-xml/temp_3.xml" />
<xslt basedir="src-xml" style="src-xml/finaloutput.xsl" in="src-xml/temp_3.xml" out="${finaloutput}" />

但这种方法,通过磁盘上的多个文件,似乎效率低下。有没有更好的方法与蚂蚁这样做?

根据Dimitre的建议更新

我自己创建了一个围绕其他各种XSL的包装器,如下所示:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:fn='http://www.w3.org/2005/xpath-functions' xmlns:exslt="http://exslt.org/common">

<xsl:import href="preprocess_1.xsl"/>
<xsl:import href="preprocess_2.xsl"/>
<xsl:import href="preprocess_3.xsl"/>
<xsl:import href="finaloutput.xsl"/>

<xsl:output method="text" />

<xsl:template match="/">
    <xsl:apply-imports />
</xsl:template>

</xsl:stylesheet>

这......不太好用。在最终输出XSL运行之前,看起来文档尚未经过预处理。我或许应该更清楚:preprocess XSL文件正在修改文档,添加属性等。 preprocess_3基于..._2的输出基于..._1。这种导入解决方案仍然合适吗?如果是这样,我错过了什么?

2 个答案:

答案 0 :(得分:1)

更有效的方法是执行单个多通道转换

文件可以保持原样 - 它们将使用xsl:import指令导入。

节省的费用很明显

  1. 只需一次启动(加载XSLT处理器)。

  2. 只有一个终止。

  3. 消除两个中间文件及其创建,写入,关闭和删除。

答案 1 :(得分:0)

嗯,你说我知道exsl:node-set 的诀窍,但是你没有在你的尝试中使用它(“在Dimitre的建议之后更新”)。如果你不知道,或者其他人(比如我)不知道如何进行多遍变换,这里有一篇不错的文章:Multipass processing

这种方法的缺点是它需要特定于引擎的xsl代码。所以如果你知道引擎,你可以试试这个。如果您不了解引擎,可以尝试使用result tree fragment to node-set: generic approach for all xsl engines中的解决方案。

查看这些来源可以得出一个结论:您当前的解决方案更具可读性。但是你在追求效率,所以可能会牺牲一些可读性。