XSLT apply-templates的默认选择是什么?

时间:2012-10-03 11:34:51

标签: xslt xslt-2.0

身份模板如下所示:

<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 />

3 个答案:

答案 0 :(得分:17)

  

<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()"/>

答案 1 :(得分:4)

<xsl:apply-templates/>的默认选择仅为"node()",不包含属性。

答案 2 :(得分:1)

default selection of apply-templatesnode(),是child::node()的简写。此XPath表达式的计算方法如下:

  • 首先,来自&#34;孩子的所有节点&#34; axis已被采纳。这是当前元素的所有直接子元素,即其他元素,文本和注释,但属性。
  • 然后使用node test&#34;节点()&#34;过滤此节点集。在这种情况下,没有过滤任何元素,因为该测试匹配所有内容。

因此,对于<xsl:apply-templates />,将应用子元素的模板,但不应用于属性。如果是复制模板,这意味着不会复制属性。