带有包含的XSLT重复模板

时间:2011-02-18 18:07:07

标签: visual-studio-2008 xslt

我遇到了包含xslt模板的问题。

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

b和c都需要位于d.xslt中的模板。如果我在b和c中添加include语句,我在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错误文本。

3 个答案:

答案 0 :(得分: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唯一真正的缺点是你可能会意外地在导入链中进一步覆盖模板而不知道它(因为你不会得到与{{1}相同的编译错误})。可能会有轻微的性能损失,因为XSLT处理器必须“思考”一点关于导入链,但我没有发现这是一个问题。

答案 1 :(得分:1)

VS2008等IDE在编辑样式表文档时,往往会相信它必须完整,即与其包含/导入的内容一起使用,所有名称都必须解析。事实上,根据XSLT语言并非如此;当A包含B时,B中的组件引用A中的组件是非常合法的,即使B不包括A.我相信oXygen在某个地方有一个允许您控制它的开关。 XSLT允许循环包含,但它们可能会导致某些处理器出现问题。

答案 2 :(得分:0)

来自http://www.w3.org/TR/xslt#named-templates

  

如果是样式表,则会出错   包含多个模板   相同的名称和import precedence

这也表明xsl:import机制优于包含(在大多数情况下),它应该被视为转换之间的继承机制。