2012-10-18 43 views
1

我有多個XSLT文件用於在流水線中處理源XML。我知道exsl:node-set這個技巧,但是在遇到這個工作流程的一些問題之後,我決定將各種通道分成單獨的XSL文件。我現在對文件結構感到高興,並且工作流在Eclipse中正常工作。我們的發佈系統與螞蟻一起工我能處理的文件是這樣的:與螞蟻一起使用單個管道中的多個XSLT文件

<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

更有效的方法是執行單個多通道轉換。這些文件可以保持原樣 - 它們將使用'xsl:import'指令導入。節省是顯而易見的 - 只需一次啓動(加載XSLT處理器)和終止,也消除了兩個中間文件及其創建,寫入,關閉和刪除。 –

+0

@DimitreNovatchev,聽起來不錯 - 明天我會試試看。您可能想要將其作爲答案而不是評論? –

+0

Jon Bright:作爲回答添加。 –

回答

1

的更有效的方法是執行一個單一的,多通道轉化

這些文件可以保持原樣 - 它們將使用xsl:import指令導入。

節省是明顯的

  1. 剛一點開始(XSLT處理器的加載)。

  2. 只有一個終止。

  3. 消除兩個中間文件及其創建,寫入,關閉和刪除。

0

嗯,你說我知道有exsl的伎倆:節點集,但你不要在你嘗試使用它(「更新以下Dimitre的建議」)。如果你不知道它,或者對於不知道如何進行多通道轉換的其他人(比如我),這裏是一篇不錯的文章:Multipass processing

這種方法的缺點是它需要引擎特定的xsl代碼。所以如果你知道引擎,你可以試試這個。如果你不知道引擎,你可以嘗試使用result tree fragment to node-set: generic approach for all xsl engines的解決方案。

看着這些資源,可以肯定的是:您當前的解決方案更具可讀性。但是你正在尋求效率,所以一些可讀性可能會被犧牲。