xsl:apply-templates如何只匹配我定义的模板?

时间:2008-12-06 15:10:46

标签: xslt

我有几个匹配xml文档中各个节点的模板。如果我只做一个 < XSL:适用的模板/>  它以某种方式递归输出下面所有节点的文本。我只是想让它递归匹配我定义的任何模板。我怎么做 ?

3 个答案:

答案 0 :(得分:38)

  

这是因为   XSLT中的内置模板。 XSLT有一个   几个内置的模板,其中   说:

     
      
  • 将模板应用于元素时,处理其子元素
  •   
  • 将模板应用于文本节点时,请提供其值
  •   
     

一起,这意味着如果你申请   模板到元素但没有   该元素的显式模板,   然后它的内容得到处理和   最终你最终得到了文本   该元素包含。

请在此处阅读完整说明:http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

您可以通过定义自己的模板来覆盖文本节点的默认模板,并使其无效。

<xsl:template match="text()" />

答案 1 :(得分:24)

这可能是XSLT程序员经验最常见的问题。

观察到的行为正是XSLT兼容处理器的行为方式。

考虑到:

<xsl:apply-templates/>

是:

的缩写

<xsl:apply-templates select="child::node()"/>

并且存在内置模板规则。根据{{​​3}}。:

5.8内置模板规则

有一个内置的模板规则,允许在样式表中的显式模板规则没有成功模式匹配的情况下继续递归处理。此模板规则适用于元素节点和根节点。以下显示了内置模板规则的等效内容:

<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

每种模式还有一个内置模板规则,它允许递归处理在样式表中的显式模板规则没有成功模式匹配的情况下以相同模式继续。此模板规则适用于元素节点和根节点。以下显示模式m的内置模板规则的等效项。

<xsl:template match="*|/" mode="m">
  <xsl:apply-templates mode="m"/>
</xsl:template>

还有一个内置模板规则,用于通过以下方式复制文本的文本和属性节点:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

处理说明和注释的内置模板规则是什么都不做。

<xsl:template match="processing-instruction()|comment()"/>

命名空间节点的内置模板规则也不做任何事情。没有可以匹配命名空间节点的模式;因此,内置模板规则是应用于命名空间节点的唯一模板规则。

内置模板规则被视为在样式表之前隐式导入,因此的导入优先级低于所有其他模板规则因此,作者可以通过包含显式模板规则来覆盖内置模板规则

--- XSLT规范引用结束---

因此,如果作者希望完全控制XSLT处理,他们应该覆盖所有内置模板

例如,如果我们不希望将text()个节点复制到输出中,我们可以通过以下方式覆盖内置模板来忽略它们:

<xsl:template match="text()" />

答案 2 :(得分:2)

您可以将模式设置为仅应用自己的模板:

<xsl:template match="* | /" >
    <xsl:apply-templates mode="myMode" />
</xsl:template>

<xsl:template match="somenode" mode="myMode">
  <!-- do something here -->
</xsl:template>

另一种选择是覆盖内置模板规则(参见例如http://unix.com.ua/orelly/xml/xmlnut/ch08_07.htm