【问题标题】:What is the default select of XSLT apply-templates?XSLT 应用模板的默认选择是什么?
【发布时间】:2012-09-24 07:55:21
【问题描述】:

身份模板如下所示:

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

&lt;xsl:apply-templates select="@*|node()" /&gt; 的选择是否超过了&lt;xsl:apply-templates /&gt;,或者身份模板可能是这样的?

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

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

<xsl:apply-templates />

【问题讨论】:

    标签: xslt xslt-2.0


    【解决方案1】:

    &lt;xsl:apply-templates select="@*|node()" /&gt; 是否选择超过 &lt;xsl:apply-templates /&gt;,或者身份模板可能是 像这样?

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

    【讨论】:

    • @OP: P.S.这在w3.org/TR/xslt#section-Applying-Template-Rules 中定义:“在没有选择属性的情况下,xsl:apply-templates 指令处理当前节点的所有子节点,包括文本节点。...”请注意,属性节点是 视为其父元素的子元素。
    • @LarsH,是的,但有时读者会发现引用规范“令人生畏”:)
    • 是的,如果我必须在仅引用规范和仅解释其含义之间做出选择,我会选择您的答案(除非我认为规范的含义在这一点上很容易理解) .然而,结合有用的解释,我认为将用户指向主要材料有助于他们“学习如何钓鱼”。这里的 OP 似乎是一个有成就的程序员,他不应该害怕规范。 :-)
    【解决方案2】:

    &lt;xsl:apply-templates/&gt; 的默认选择只是 "node()",它不包括属性。

    【讨论】:

    • 啊,那完全有道理:)
    【解决方案3】:

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

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

    所以对于&lt;xsl:apply-templates /&gt;,应用了子元素的模板,但不适用于属性。在复制模板的情况下,这意味着属性不会被复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多