<xsl:apply-templates />和<xsl:apply-templates select="." />有什么区别?

8
< p > <xsl:apply-templates /><xsl:apply-templates select="." />有什么区别?我认为select="."是不必要的,但是根据使用的不同,我得到了不同的结果。

如果这是重复的问题,我很抱歉。我已经尝试搜索此问题,但是没有找到任何内容。


2
好问题,+1。请查看我的答案,了解这两个指令之间的区别和一个警告的详细解释。 :) - Dimitre Novatchev
2个回答

18

<xsl:apply-templates /><xsl:apply-templates select="." />

有什么区别?

第一个指令:

<xsl:apply-templates />

是的简写形式:

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

第二条指令:

<xsl:apply-templates select="." />

是一个简写形式:

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

正如我们所看到的,这两个指令不仅不同(前者将模板应用于所有子节点,而后者将模板应用于当前节点),而且后者很危险,经常会导致无限循环!


4

您是否在思考以下两个概念的区别:

<xsl:apply-templates />

并且。
<xsl:apply-templates select="*" />

我问这个问题的原因是,<xsl:apply-templates select="." /> 很少用到,而 <xsl:apply-templates select="*" /> 则很常见。
在这两种选择之间,select="*" 通常是不必要的,但它们之间存在差异:
- 正如 Dimitre 指出的那样,没有 select 的 <xsl:apply-templates /> 将处理所有子节点。这包括注释、处理指令和最重要的文本节点,以及子元素。 - 相比之下,<xsl:apply-templates select="*" /> 只会选择子元素节点。
所以,如果输入的 XML 可能有除了元素以外的子节点,并且您不想处理那些节点,<xsl:apply-templates select="*" /> 是您想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接