XSLT 应用模板的默认选择是什么



标识模板如下所示:

<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 /> ,将应用子元素的模板,但不应用属性的模板。对于复制模板,这意味着不会复制属性。

最新更新