2011-04-18 106 views
20

我有2個模板XSL模板優先

<template match="vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
    ... 
</xsl:template> 
<xsl:template match="vehicle_details[descendant::color = 'red']/*" > 
    ... 
</xsl:template> 

我的問題是:哪個模板將優先於轉型。有人可以給我一個關於XSL模板優先級的概述/資源嗎?

在此先感謝!

回答

38

全分辨率過程在section 5.5 of the XSLT spec中描述。

在一般情況下,適用下列規則,以便(例如,由於較低的導入優先排除在考慮之外的模板被永久淘汰,而不管其優先級):

  1. 導入的模板比在模板中的優先級較低初始樣式表
  2. 具有較高值priority屬性的模板具有較高的優先級
  3. 沒有priority屬性的模板被分配默認優先級。具有更多特定模式的模板優先。
  4. 如果前面的三個步驟考慮了多個模板,但是XSLT處理器可以通過默認文件中的最後一個來恢復,那麼這是一個錯誤。

在您的具體情況下,兩個模板具有相同的優先級,因此上述#4適用。爲了證明:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match= 
      "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
     template1 
    </xsl:template> 
    <xsl:template match="vehicle_details[descendant::color = 'red']/*"> 
     template2 
    </xsl:template> 
</xsl:stylesheet> 

應用於此輸入(兩個模板匹配):

<root> 
    <vehicle_type>4x4</vehicle_type> 
    <vehicle_details> 
     <color>red</color> 
    </vehicle_details> 
</root> 

輸出:

template2 

但是,如果我們換模板的順序:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="vehicle_details[descendant::color = 'red']/*"> 
     template2 
    </xsl:template> 
    <xsl:template match= 
      "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
     template1 
    </xsl:template> 
</xsl:stylesheet> 

然後輸出是:

template1 
+1

一個很好的解釋必須絕對清楚地表明導入優先級和'priority'是兩個不同的東西,不管在導入的樣式表的模板都有,它的優先級是優先級有多高,比任何模板的優先級低導入樣式表。 – 2011-04-19 02:35:58

+0

@Dimitre - 我打算按順序閱讀規則。也許這並不明確。我已經添加了一些解釋。 – 2011-04-19 02:44:20

+2

+1正確答案。 **觀察:依賴錯誤恢復機制是不好的做法** – 2011-04-19 15:55:06