我有一个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(在调试器中)对它进行了测试,它们都表现得非常明显(即不要将最后一个模板视为匹配模板)。
答案 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>
指令从所选模板中应用“次佳”模板。