理解`apply-templates`匹配

Phi*_*ham 5 xslt

我是否认为apply-templates声明应该匹配所有可能适用于选择的模板?

例如,给定以下xml片段:

<doc>
  <foo bar="1" baz="2">boz</foo>
</doc>
Run Code Online (Sandbox Code Playgroud)

和以下样式表:

<xsl:template match="/">
  <xsl:apply-templates select="foo" mode="xyz" />
</xsl:template>

<xsl:template mode="xyz" match="foo[bar='1']">
  abc
</xsl:template>

<xsl:template mode="xyz" match="foo[baz='2']">
  def
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

abc
def
Run Code Online (Sandbox Code Playgroud)

它是否正确?

Fra*_*ank 6

不,您不会同时获得两个输出,因为只会选择一个模板.如果有多个可能的模板,请参阅此页面以了解有关冲突解决的规则.

修复样式表后(类似于Rubens的做法,但使用相同的模式),这通常会导致xslt文件中的最后一个模板被应用,因此输出将是def.这是因为两个模板具有相同的优先级,如果您的xslt处理器没有因错误而停止,则标准要求它应用最后一个:

如果这留下多个匹配的模板规则,则会出错.XSLT处理器可能会发出错误信号; 如果它没有发出错误信号,它必须通过从剩下的匹配模板规则中选择样式表中最后出现的那个来恢复.