在XSLT中覆盖命名模板

4
我有一个包含元数据的meta.xsl文件,我有一个调用模板:
<xsl:call-template name="og-type" />

模板位于meta.xsl文件中(适用于所有页面):

<xsl:template name="og-type">
 <meta property="og:type" content="website"></meta>
</xsl:template>

问题是如何覆盖这个模板,我需要在Articles.xsl中使用被覆盖的模板(仅适用于文章页面)。
<xsl:template name="og-type">
 <meta property="og:type" content="article"></meta>
</xsl:template>

是的,我可以将模板的第一个变体放在Mainpage.xsl中,但如果还有10个以上的模板怎么办?我会因为调用空内容而出现错误。


2
不确定这是否是一个解决方案,但可以尝试在模板上添加“priority”属性。 - Flynn1179
无法工作(编译错误: 文件/templates/article.xsl 第263行元素templatexsl:template: 错误,重复名称'og-type' - DenimTornado
3
你发布的两个OG类型模板是相同的。答案是针对重要性优先级更高的模板,或者定义你的U模板,使其根据输入文档输出不同的模板(这可能意味着使用匹配模板而不是命名模板更容易)。但你没有提供输入的指示,所以很难说。 - David Carlisle
再次更新代码,现在与网站上的一样。 - DenimTornado
1个回答

3
如果您想在将基本样式表导入到另一个样式表时以静态方式覆盖模板,则优先级或模式可能是最佳答案。优先级实际上具有内置的“重要性”因素,因此导入样式表的版本应始终是默认选择的版本,除非优先级或模式覆盖该选择。

http://www.w3.org/TR/xslt#conflict

如果您只想在特定条件下处理不同的行为,那么您需要将变量模板与XSLT模式相关联,并且在该点上方的某个模板中具有逻辑来识别哪种情况是相关的,并发出调用模板以切换到适当的模式。

http://www.w3.org/TR/xslt#modes


据我所知,命名模板没有优先级,只有带有“匹配”属性的模板才有优先级: https://www.w3.org/TR/xslt-30/#element-template - Martynas Jusevičius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接