2011-02-18 82 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允许循环包含,但它们可能会导致某些处理器出现问题。