标识模板如下所示:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:apply-templates select="@*|node()" />
选择的不仅仅是<xsl:apply-templates />
,还是身份模板是这样的?
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
当我执行以下操作时,究竟选择了什么?
<xsl:apply-templates />
<xsl:apply-templates select="@*|node()" />
选择超过吗<xsl:apply-templates />
,或者标识模板可能是 喜欢这个?
<xsl:apply-templates/>
相当于:
<xsl:apply-templates select="node()"/>
这是一个较短的前者:
<xsl:apply-templates select="child::node()"/>
这相当于:
<xsl:apply-templates select="* | text() | comment() | processing-instruction()"/>
正如我们从上一条指令中看到的,您询问的xsl:apply-templates
指令没有选择任何属性,因此它不能用作以下的简写:
<xsl:apply-templates select="@*|node()"/>
<xsl:apply-templates/>
的默认选择只是"node()"
,它不包括属性。
应用模板的默认选择是 node()
,这是 child::node()
的简写。此 XPath 表达式的计算方法如下:
- 首先,取自"子"轴的所有节点。这都是当前元素的直接子元素,即其他元素、文本和注释,但不是属性。
- 然后使用节点测试 "node()" 过滤此节点集。在这种情况下,不会筛选任何元素,因为该测试与所有内容匹配。
因此,对于 <xsl:apply-templates />
,将应用子元素的模板,但不应用属性的模板。对于复制模板,这意味着不会复制属性。