2016-12-05 71 views
0

我有以下問題。我正在嘗試使用XSL-T轉換XML文件。我有一個XSL文件是這樣的:XSL - 調用模板和其他標籤的匹配輸出

<!-- here are some imports--> 
<xsl:import href="..."/> 

<!-- here is template--> 
<xsl:template match="..."> 
    <!-- here are some new tags to be added to the document --> 
</xsl:template> 

<!-- here is second template--> 
<xsl:template match="..."> 
    <!-- here are some new tags and template-calls from imported xsl documents, such as: --> 
    <xsl:call-template name="..."/> 
</xsl:template> 

<!-- here is the place, where I want to create a match for output from all previous lines... --> 
<!-- ... --> 

因此,給定的代碼段註釋顯示在這個XSL文件會發生什麼。我有多個導入和很多模板調用。不幸的是,我需要在所有給定行的輸出中添加一些標記,並且必須在此文件中執行此操作。我寧願使用另一個模板和匹配屬性,但我怎麼能做到這一點?

我無法編輯所有導入的文檔。另外,我不想創建臨時幫助文件。 XSL版本是1.0。

預先感謝您:)

+1

請顯示確切的匹配模式和模板內容以及樣例輸入和您想要的結果。 –

+1

你的問題並不完全清楚。通常,XSLT樣式表在XML輸入上運行,而不是在它自己的輸出上運行。如果要處理應用模板的結果,請在變量中應用,然後處理該變量。或者讓第二個樣式表處理由第一個樣式表創建的文檔。 –

回答

1

當您申請轉換到另一個轉換的輸出,這就是通常所說的管道。在XSLT中實現管道有兩種主要技術:一種是針對每個轉換使用一個單獨的樣式表,並使用某些外部技術(如Ant,XProc,ShellScript,Java應用程序或某種框架)將它們鏈接在一起如Coccoon。另一種方法是一個樣式表,其中,典型的編碼模式是內管道

<xsl:template match="/"> 
    <xsl:variable name="temp1"> 
    <xsl:apply-templates select="." mode="phase-1"/> 
    </xsl:variable> 
    <xsl:variable name="temp2"> 
    <xsl:apply-templates select="$temp1" mode="phase-2"/> 
    </xsl:variable> 
    <xsl:apply-templates select="$temp2" mode="phase-3"/> 
</xsl:template> 

的多樣式的方法具有兩個優點:(a)的代碼是更加模塊化,因此更可重複使用的,和(b)上述代碼在XSLT 1.0中實際上不起作用,因爲您不能將常規處理應用於「結果樹片段」 - 您可以使用EXSLT node-set()擴展函數在大多數XSLT 1.0處理器中解決此問題,因此它成爲

<xsl:apply-templates select="exslt:node-set($temp1)" mode="phase-2"/> 

但你是正確的軌道上看着流水線處理 - 一個複雜的轉換分解成sequenc簡單的步驟絕對是正確的路要走。

+0

非常感謝。你的回答簡直太棒了。 我已經決定使用另一個樣式表,並將轉換的下一步添加到Ant構建工具。這種方法更加可重用,並且更容易維護和理解邏輯。 – KP13