2011-07-21 14 views
3

我正在做一些非常複雜的XSLT 1.0轉換同一節點的幾個XSLT 1.0通行證的做法。我想結合這8遍而不將它們合併到一個文件中(這太複雜了)。我的解決方案將使用xsl:includeexsl:node-set合併通道並將臨時結果存儲在變量中。最適合(目前使用8 XSLT通過)相結合,其處理

但我有一個問題:我的轉變通過大多數節點和僅修改某些方面的副本。因此,我需要處理在每次通過同一節點,但不同xsl:template!但我該怎麼做?如何知道第一遍後,我想要應用其他XSLT樣式表中的模板?

非常簡單的例子(2 XSLT通過)什麼我目前做:

來源:

<h>something here</h> 

XSLT通1後:

<h someattribute="1">something here</h> 

後XSLT傳2:

<h someattribute="1" somemoreattribute="2">something here, and even more</h> 

我目前的做法是調用兩次XSLT處理器,並保存結果在磁盤上的臨時:

xsltproc stylesheet1.xsl input.xml >temp.xml 
xsltproc stylesheet2.xsl temp.xml >finalresult.xml 
+1

+1爲好問題。看到這個【答案】(http://stackoverflow.com/questions/6720009/multiple-xslt-files-to-single-xslt-file-for-2-different-xml-files/6720353#6720353)和@尤卡的答案。 –

回答

2

一可能的解決方案是更改每個樣式表以使用不同的mode。然後,你可以通過依次在每個模式中應用模板它們全部導入到你的主樣式表,並做多遍:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:exsl="http://exslt.org/common" 
       extension-element-prefixes="exsl" 
       version="1.0"> 

    <xsl:import href="stylesheet1.xsl"/> <!-- assuming mode="stylesheet1" --> 
    <xsl:import href="stylesheet2.xsl"/> <!-- assuming mode="stylesheet2" --> 
    <xsl:import href="stylesheet3.xsl"/> <!-- assuming mode="stylesheet3" --> 

    <xsl:template match="/"> 
    <xsl:variable name="temp1"> 
     <xsl:apply-templates select="." mode="stylesheet1"/> 
    </xsl:variable> 
    <xsl:variable name="temp2"> 
     <xsl:apply-templates mode="stylesheet2" select="exsl:node-set($temp1)"/> 
    </xsl:variable> 
    <xsl:apply-templates mode="stylesheet3" select="exsl:node-set($temp2)"/> 
    </xsl:template> 

</xsl:stylesheet> 

的缺點是,你需要修改原來的樣式表,加入適量mode屬性,每個xsl:templatexsl:apply-templates。您仍然可以使樣式表也可以獨立工作,方法是在每個樣式中添加一個像這樣的額外模板:

<xsl:template match="/"> 
    <xsl:apply-templates select="." mode="stylesheet1"/> 
</xsl:template> 
+0

偉大的回答Jukka。重寫XSLT並添加模式對我來說可以。謝謝你寫這麼多。我學到了關於XSLT的新東西。 – therealmarv

+0

編輯答案,通過在兩個地方將'select =「。」'添加到'xsl:apply-templates'來修復XSLT,以便使樣式表也適當地將模板應用到根節點。 –

0

爲什麼不使用

<xsl:param name="iteration"/> 

而且通過迭代次數樣式表?然後,您可以使用它像這樣

<xsl:if test="$iteration = 1"> 
    ... 
</xsl:if> 

...或在其他情況下

您可以

javax.xml.transform.Transformer.setParameter("iteration", 1); 

或用螞蟻設置參數:

<xslt ...> 
    <param name="iteration" expression="1"/> 
</xslt> 
+0

當我使用'XSL:param'我會有很大的'的xsl:在我的模板choose'結構,只有1個XSLT是沒有人會明白的。我有8個獨立的XSLT是有原因的 - >它們非常複雜並且將它們分離爲8個XSLT是保持它們可維護性的唯一選項。 – therealmarv