2011-02-18 81 views
4

我遇到了包含xslt模板的問題。包含XSLT重複模板

我有一個包含b.xslt和c.xslt的a.xslt。

b和c都需要位於d.xslt中的模板。如果我添加包括語句B和C,我得到一個複製模板錯誤在VS2008:

The named template 'MyTemplate' does not exist. 

,當我試着打使用這些XSLT文件我得到一個錯誤的網頁,他們不顯示正確。

如果我在a.xslt包括d.xslt它會顯示正確,但我在B和C指出,我引用的模板不存在得到一個錯誤:

'MyTemplate' is a duplicate template name. 

會是什麼是否有這種包含樹的正確方法?或者,這可能只是一個VS2008問題?

我可以刪除d.xslt並將該模板添加到b和c中,但如果模板位於同一位置,則更易於管理。

  • 編輯:添加了實際的VS2008錯誤文本。
+0

我不知道*重複的模板錯誤*是什麼...... – 2011-02-18 18:23:20

+0

@Ajjandro:編輯包含VS2008錯誤的實際文本 – 2011-02-21 10:07:08

回答

10

使用xsl:include與將它們全部粘貼到一個巨型文件中相同,這也會給您相同的重複模板錯誤。

使用xsl:import而不是xsl:include
它會覆蓋/合併所有的模板,給你一個超集。導入鏈中的最後一個模板將「贏」,而不是給您一個重複的定義錯誤,因爲它具有更高的優先級。

  • 有a.xslt xsl:import b.xslt和c.xslt。
  • 有b.xslt和c.xslt xsl:includexsl:import d.xslt。

就個人而言,我傾向於總是使用xsl:import而不是xsl:include

xsl:import唯一真正的缺點是,您可能會意外地在導入鏈中進一步覆蓋模板,但不知道它(因爲您不會得到與xsl:include相同的編譯錯誤)。可能會有輕微的性能下降,因爲XSLT處理器必須「思考」更多關於進口鏈的問題,但我沒有發現這是一個問題。

1

像VS2008這樣的IDE傾向於相信,當你編輯一個樣式表文檔時,它必須是完整的,也就是說,和它包含/導入的東西一起,所有的名字都必須解決。事實上,根據XSLT語言,情況並非如此;當A包含B時,對於B中的組件來說,即使B不包含A,也是合法的。我相信oXygen在某個地方有一個開關,允許你控制它。 XSLT允許循環包含,但它們可能會導致某些處理器出現問題。