xsl:copy,xsl:next-match和xsl:copy-of之间的主要区别

时间:2014-10-03 14:39:32

标签: xslt

请建议这些XSLT函数之间的主要区别,其中以下输入和XSLT代码的这三个函数的结果相同(删除注释和执行)。建议使用这些功能的特殊重要性。这些功能在名称空间区域中是否不同。 (XSLT2)

输入xml:

<root>
  <a>The text a1
      <b>The text b1</b>
      <b>The text b2
          <c>The text c1</c>
      </b>
          <c>The text c2</c>
   </a>
</root>

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<!--xsl:template match="b">
    <xsl:element name="B"><xsl:next-match/></xsl:element>
</xsl:template-->

<!--xsl:template match="b">
    <xsl:element name="B"><xsl:copy-of select="."/></xsl:element>
</xsl:template-->

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

</xsl:stylesheet> 

1 个答案:

答案 0 :(得分:1)

您目前无法看到您的方法之间的差异,因为您的示例仍然过于简单。让我们先描述<xsl:copy-of><apply-templates>之间的区别:<xsl:copy>制作上下文节点.文字副本例如:

<b>The text b2
   <c>The text c1</c>
</b>

在文字副本中,如果子标记<c>存在任何匹配规则,则XSLT处理器不再检查。他们完全被忽略了。 但是,代码<xsl:apply-templates>会将所有可用的模板规则应用于任何给定的深度,因此如果您有<c>的规则,则会应用该规则。

因此:要查看前两个选项之间的差异,请为<c>创建模板匹配,为其制作文字副本。

了解<xslt:next-match>的使用稍微困难一些。它要求您知道下一个最佳模板匹配将在您调用它的位置。在您的情况下,因为您只有默认的复制规则

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

<b>的特定规则旁边,默认规则是下一个最佳。当然,默认规则除了使用<apply-templates>再次复制子树之外别无其他,因此您没有看到任何差异。

为了查看其中的差异,规则需要为<b>创建一个规则,该规则不如现有具体但同时更多具体表示默认规则。这可能很难做到。