Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt xsl:apply模板如何仅匹配我定义的模板?_Xslt - Fatal编程技术网

Xslt xsl:apply模板如何仅匹配我定义的模板?

Xslt xsl:apply模板如何仅匹配我定义的模板?,xslt,Xslt,我有几个模板匹配xml文档中的各个节点。如果我只做一个 它以某种方式递归地输出下面所有节点的文本。我只希望它递归地匹配我定义的任何模板。我该怎么做 您可以设置一种模式,仅应用您自己的模板: <xsl:template match="* | /" > <xsl:apply-templates mode="myMode" /> </xsl:template> <xsl:template match="somenode" mode="myMode"&

我有几个模板匹配xml文档中的各个节点。如果我只做一个

它以某种方式递归地输出下面所有节点的文本。我只希望它递归地匹配我定义的任何模板。我该怎么做

您可以设置一种模式,仅应用您自己的模板:

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

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

另一种选择是覆盖内置模板规则(参见示例)

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

  • 将模板应用于元素时,请处理其子元素
  • 将模板应用于文本节点时,请指定其值
总之,这意味着如果你申请 将模板添加到元素,但没有 该元素的显式模板, 然后对其内容进行处理并 最终你会得到文本 元素所包含的

请阅读此处的完整说明:

您可以通过定义自己的模板来替代文本节点的默认模板,而不让它执行任何操作

<xsl:template match="text()" />
<xsl:template match="processing-instruction()|comment()"/>
这可能是有经验的XSLT程序员遇到的最常见的问题

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

考虑到:

是以下内容的缩写:

以及内置模板规则的存在。据报道:

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="text()" />
<xsl:template match="processing-instruction()|comment()"/> 命名空间节点的内置模板规则也是什么都不做。没有可以匹配命名空间节点的模式;因此,内置模板规则是应用于命名空间节点的唯一模板规则

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

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

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

例如,如果我们不想将
text()
节点复制到输出,可以通过以下方式重写内置模板来忽略它们:


如果在XSLT2.0中使用模板模式,则使用
可能会有所帮助。否则,例如,如果您执行
,则默认文本模板仍然适用。