2012-07-23 100 views
0

使用外部XSLT我要導入的XSLT樣式表,但本質上已經是默認被忽略掉,只有當呼籲使用它的模板。僅適用於特定的模板

我們的內容包含自定義XML + DocBook的樣式表,因此它目前由兩個XSLT文件轉換:XML => my.xsl => docbook.xsl => XHTML。是否有可能從my.xsl完成這一切?

<!-- My XML --> 
<xsl:template match="a"/> 
<xsl:template match="b"/> 
<xsl:template match="c"/> 

<!-- DocBook XML --> 
<xsl:template match="table"> 
    <xsl:apply-templates select="." mode="docbook"/> 
</xsl:template> 

與進口docbook.xsl樣式表的問題是,它包括與現有模板干擾的許多其他模板。理想情況下,會有一種將docbook.xsl導入指定模式的方法,但這是不可能的。有沒有辦法做到這一點,而不修改docbook.xsl?在主樣式表

回答

2

模板總是比進口的樣式模板更高的優先級。爲了避免調用導入的模板,只需在必要的情況下在主要模板中覆蓋它們即可。

這應該是優選的技術。替代方案是:

  1. 確定存在潛在衝突的匹配模式。
  2. 使用模式來區分兩者。
  3. 當你與< XSL調用您的模板:應用模板>上選擇哪些適合你的標識重疊模式之一,使用適當的模式(或無模式)來實現你想要的結果(主模板與進口模板) 。
+1

@wst如果添加的進口(主要)樣式的身份轉換,導入模板永遠不會叫,除非你明確地調用進口使用xsl:apply-imports的模板。 – grtjn 2013-01-22 08:38:52

1

使用modes

在導入的樣式表都模板是與無人使用唯一的名稱的模式。例如,使用prefix:mymode並將前綴prefix綁定到屬於您的名稱空間。

要從導入的樣式表調用處理,使用

<xsl:apply-templates select="$vNodesToBeProcessed" mode="prefix:mymode"/> 
+0

不幸的是,docbook.xsl是一個包含多個文件和數百個模板的大型模塊,因此無法輕鬆修改以適應模式。我嘗試重新編譯所有文件,將模式添加到所有模板中,但是它引發了更多問題。 – wst 2012-07-24 18:00:38

+0

@wst,然後使用* primary *樣式表模塊中的模式。 – 2012-07-24 18:12:48