14

身份模板如下所示:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:apply-templates select="@*|node()" />select more than <xsl:apply-templates />,或者身份模板可能是这样的?

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

当我执行以下操作时,究竟选择了什么?

<xsl:apply-templates />
4

3 回答 3

19

<xsl:apply-templates select="@*|node()" />select more than <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()"/>
于 2012-10-03T12:00:28.867 回答
5

默认选择<xsl:apply-templates/>只是"node()",它不包括属性。

于 2012-10-03T11:37:28.833 回答
2

apply-templates的默认选择是node(),它是child::node(). 此 XPath 表达式的计算方式如下:

  • 首先,取“子”的所有节点。这是当前元素的所有直接子元素,即其他元素、文本和注释,但不是属性。
  • 然后用节点测试“node()”过滤这个节点集。在这种情况下,不会过滤任何元素,因为该测试匹配所有内容。

因此,使用 时<xsl:apply-templates />,将应用子元素的模板,但不适用于属性。在复制模板的情况下,这意味着属性不会被复制。

于 2012-12-06T18:15:38.737 回答