我有多个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
。这种导入解决方案仍然合适吗?如果是这样,我错过了什么?
答案 0 :(得分:1)
更有效的方法是执行单个多通道转换。
文件可以保持原样 - 它们将使用xsl:import指令导入。
节省的费用很明显:
只需一次启动(加载XSLT处理器)。
只有一个终止。
消除两个中间文件及其创建,写入,关闭和删除。
答案 1 :(得分:0)
嗯,你说我知道exsl:node-set 的诀窍,但是你没有在你的尝试中使用它(“在Dimitre的建议之后更新”)。如果你不知道,或者其他人(比如我)不知道如何进行多遍变换,这里有一篇不错的文章:Multipass processing 。
这种方法的缺点是它需要特定于引擎的xsl代码。所以如果你知道引擎,你可以试试这个。如果您不了解引擎,可以尝试使用result tree fragment to node-set: generic approach for all xsl engines中的解决方案。
查看这些来源可以得出一个结论:您当前的解决方案更具可读性。但是你在追求效率,所以可能会牺牲一些可读性。