【问题标题】:Understanding xsl:copy with xsl:apply-templates (XSLT 2.0)理解 xsl:copy 和 xsl:apply-templates (XSLT 2.0)
【发布时间】:2016-02-15 08:28:16
【问题描述】:

以下三个模板有什么区别?

<xsl:template match="food">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>

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

<xsl:template match="food">
<xsl:copy>
</xsl:copy>
<xsl:apply-templates/>
</xsl:template>

我的猜测是第一个和第二个是相同的。但是第三个呢?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:
    <xsl:template match="food">
    <xsl:copy>
    <xsl:apply-templates/>
    </xsl:copy>
    </xsl:template>
    

    复制food 元素,然后将模板应用到该元素的子节点(子元素、cmets 和文本节点),将结果放在复制的元素中。它对原始food元素所具有的任何属性做任何事情。

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

    同上,但将模板应用于food 元素的属性及其子元素。这是否有任何可观察到的效果取决于是否有任何模板与这些属性节点匹配以及这些模板的作用。如果您有一个通用标识模板(见下文),那么复制的 food 元素最终将具有与原始元素相同的属性。

    <xsl:template match="food">
    <xsl:copy>
    </xsl:copy>
    <xsl:apply-templates/>
    </xsl:template>
    

    与第一种情况一样,但将模板应用到子元素的结果放置在(空)复制的food 元素之后,而不是在其中。

    通常,您会希望看到此类模板与通用“身份”模板一起出现

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

    除了更具体的模板覆盖此行为之外,所有内容均未更改

    【讨论】:

      【解决方案2】:

      我猜第一个和第二个是一样的。

      不,它们不一样。第一个不将模板应用于属性。这两个是一样的:

      <xsl:apply-templates>
      
      <xsl:apply-templates select="node()">
      

      但是第三个呢?

      第三个在复制节点之外应用模板,导致层次结构扁平化:子节点将成为兄弟节点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 2020-11-21
        • 2012-09-20
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 2011-04-28
        相关资源
        最近更新 更多