全分辨率過程在section 5.5 of the XSLT spec中描述。
在一般情況下,適用下列規則,以便(例如,由於較低的導入優先排除在考慮之外的模板被永久淘汰,而不管其優先級):
- 導入的模板比在模板中的優先級較低初始樣式表
- 具有較高值
priority
屬性的模板具有較高的優先級
- 沒有
priority
屬性的模板被分配默認優先級。具有更多特定模式的模板優先。
- 如果前面的三個步驟考慮了多個模板,但是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
一個很好的解釋必須絕對清楚地表明導入優先級和'priority'是兩個不同的東西,不管在導入的樣式表的模板都有,它的優先級是優先級有多高,比任何模板的優先級低導入樣式表。 – 2011-04-19 02:35:58
@Dimitre - 我打算按順序閱讀規則。也許這並不明確。我已經添加了一些解釋。 – 2011-04-19 02:44:20
+1正確答案。 **觀察:依賴錯誤恢復機制是不好的做法** – 2011-04-19 15:55:06