2012-07-16 82 views
0

我有一個屬性,我匹配。它將匹配2個XSL模板,但其中一個比另一個更具體。但是,除非我在樣式表中將'簡單'(謂詞不太具體)放在另一個之上,否則它將匹配更簡單的一個。從http://www.w3.org/TR/xslt/#conflict和其他問題我可以看出,如果它匹配2個模板,它將使用最具體的,然後如果它們相同,它將匹配樣式表中的最後一個。爲什麼XSL不符合此聲明?

模板1:

<xsl:template match="@audit[contains($tier,'tier_3')][((starts-with(.,'approve') and contains(.,'CM')) or (contains(.,'ReviewRequested') and not(contains(.,'CM') or contains(.,'BM') or contains(.,'ME'))))]" mode="action"> 

模板2:

<xsl:template match="@audit[contains($tier,'tier_3')]" mode="action"> 

是什麼規則,我不知道,是造成這種情況發生?

我更改匹配通過改變爲具有1組方括號代替2:

<xsl:template match="@audit[contains($tier,'tier_3') and ((starts-with(.,'approve') and contains(.,'CM')) or (contains(.,'ReviewRequested') and not(contains(.,'CM') or contains(.,'BM') or contains(.,'ME'))))]" mode="action"> 

但同樣的結果。

我知道這既因爲如果我註釋掉簡單的一個,它針對模板匹配1.

任何想法一致?

+0

[XSL模板優先順序]的可能重複(http://stackoverflow.com/questions/5709581/xsl-template-precedence) – Ben 2012-07-16 10:15:22

回答

2

它們都是同樣具體的,因爲它們都具有相同的路徑@audit,它們都有節點測試。

節點測試本身的複雜性沒有爲解析的目的進行分析。在你鏈接的文件中,這一切都非常明確 - 你是否真的讀過它?

如果您想要特定的訂單,請對模板進行排序或對模板規則使用優先級屬性。

+0

通過編寫相同的東西,但你的覆蓋它的一半。該文檔顯示了所有類型的實際優先值 – Woody 2012-07-16 10:15:05

+0

據我所知,謂詞的額外特性影響了它的選擇,但我現在看到邏輯了。謝謝。 – 2012-07-16 10:39:32