只有一个XSL模板中的两个匹配得到应用,出了什么问题?

时间:2012-01-18 14:19:37

标签: xslt

我有一个xsl样式表,其中包含以下我遇到问题的模板:

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<!-- This is the 'parent' matching template that applies two specific templates -->
<xsl:template match="*[starts-with(name(), 'my-element')]">
    <xsl:apply-templates select="." mode="mode1"/> = <xsl:apply-templates select="." mode="mode2"/>
</xsl:template>

<!-- This one gets matched and applied from the parent template above -->
<xsl:template match="my-element" mode="mode1">
    ...
</xsl:template>

<!-- And so does this one -->
<xsl:template match="my-element" mode="mode2">
    ...
</xsl:template>

<!-- But then there's also this template that does not get matched -->
<!-- from the parent -->
<xsl:template match="some-element|my-element" mode="mode2">
    ...
</xsl:template>

上一个模板(some-element | my-element)不匹配是否正常,例如因为已经有另一个模板(my-element)具有相同的模式(mode2)?

我已经使用Xalan和Visual Studio 2010(在调试器中)对它进行了测试,它们都表现得非常明显(即不要将最后一个模板视为匹配模板)。

2 个答案:

答案 0 :(得分:0)

为什么是的,这是完全正常的。见5.5 Conflict Resolution for Template Rules

答案 1 :(得分:0)

只要有多个匹配模板,XSLT处理器就会根据W3C XSLT 1.0 specification中描述的规则决定选择执行哪个模板。

只选择并执行一个模板

可以使用 <xsl:apply-imports> 在导入的样式表中调用已覆盖的模板规则。

此外,在XSLT 2.0中,可以使用 <xsl:next-match> 指令从所选模板中应用“次佳”模板。