无select属性的<xsl:apply-templates />会调用哪个模板?
关于无select属性的
<xsl:apply-templates />匹配逻辑解析 嘿,这个问题绝对是XSLT初学者的常见困惑点,我来给你讲得明明白白~
首先得明确无select属性的<xsl:apply-templates />的核心规则:
它完全等价于写 <xsl:apply-templates select="node()" />,意思是会处理当前上下文节点的所有直接子节点——这里的子节点包含元素节点、文本节点、注释节点、处理指令,只要是当前节点的直接子元素/内容都会被遍历并匹配对应模板。
结合你的示例代码具体分析
你的示例里有这样一段模板:
<xsl:template match="col_1"> <xsl:apply-templates /> </xsl:template>
当这个模板被触发执行时,当前的上下文节点就是一个col_1元素节点。此时,<xsl:apply-templates />会遍历这个col_1节点的每一个直接子节点,然后为每个子节点找到优先级最高的匹配模板来执行。
举个更具象的例子,假设你的XML输入是这样的:
<content> <set_0> <col_0>Test content</col_0> </set_0> <col_1> <sub_col>Inner text</sub_col> This is a text node inside col_1 </col_1> </content>
那处理col_1节点时,<xsl:apply-templates />会处理两个子节点:
- 第一个是
<sub_col>元素节点:如果你的XSLT里有match="sub_col"的自定义模板,就会调用该模板;如果没有自定义模板,就会触发XSLT的内置默认模板——默认模板会对元素节点再次递归调用<xsl:apply-templates />,最终输出元素内的文本内容。 - 第二个是文本节点
This is a text node inside col_1:XSLT的默认模板会直接输出这段文本内容。
和带select属性的写法对比
你提到的<xsl:apply-templates select="set_0/col_0" />是精准指定要处理的节点路径,只处理当前上下文节点下的set_0/col_0节点;而无select的写法是遍历当前节点的所有子节点,逐个匹配执行对应模板,范围更广、逻辑是“扫一遍当前节点的所有子内容”。
内容的提问来源于stack exchange,提问作者DVN-Anakin
相关产品推荐
相关产品推荐

