1

我有多个 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 运行之前没有经过预处理。在这里我可能应该更清楚:preprocessXSL 文件正在修改文档、添加属性等。 preprocess_3是基于 的输出..._2是基于..._1。这种导入解决方案仍然合适吗?如果是这样,我错过了什么?

4

2 回答 2

1

更有效的方法是执行单次多通道变换

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

节省是显而易见的

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

  2. 只有一个终止。

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

于 2012-10-18T21:20:56.407 回答
0

嗯,您说我知道 exsl:node-set 的技巧,但您没有在尝试中使用它(“按照 Dimitre 的建议进行更新”)。如果您不知道,或者对于不知道如何执行多通道转换的其他人(例如我),这里有一篇不错的文章:多通道处理

这种方法的缺点是它需要引擎特定的 xsl 代码。所以如果你知道引擎,你可以试试这个。如果您不了解引擎,可以尝试使用从结果树片段到节点集的解决方案:所有 xsl 引擎的通用方法

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

于 2012-11-03T18:54:09.117 回答