XSLT中xsl:copy和xsl:copy-of有什么区别?

15

我不明白 xsl:copyxsl:copy-of 之间的区别。

在什么情况下应该使用哪一个?


2
我们将查看规范 http://www.w3.org/TR/xslt20/#shallow-copy 和 http://www.w3.org/TR/xslt20/#copy-of。 - Martin Honnen
2
你在哪里寻找这两个指令的解释?解释中有什么让你感到困惑的地方? - Michael Kay
2个回答

28

简而言之xsl:copy 是浅拷贝;xsl:copy-of 是深拷贝。

何时使用 xsl:copy vs xsl:copy-of

  • 当你想要拷贝仅上下文项并且有其他计划用于上下文项的子元素时,请使用xsl:copy
  • 当您想要拷贝XPath选择的节点及其子元素,递归地时,请使用xsl:copy-of

xsl:copy 的注释

  • xsl:copy指令会复制上下文项,但不会复制其任何子节点。
  • 这是一种浅拷贝。
  • xsl:copy指令不能具有 @select XPath。

xsl:copy 的一个非常常见的用途可以在身份转换中找到。

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

请注意,在此处使用 xsl:copy 元素复制节点本身,然后通过 xsl:apply-templates 转换其子节点,这样其他模板就有机会在转换过程中进行干预。

xsl:copy-of 的注意事项

  • xsl:copy-of 指令对其必需的 @select 属性中的 XPath 进行评估,并递归地复制所选节点及其子节点。
  • 这是一次深层复制。
  • xsl:copy-of 指令必须具有 @select XPath。

请注意,xsl:copy-of 可以在标识转换中使用,但是允许其他模板在递归期间匹配提供了更大的灵活性。


1

xsl:copy是一种浅复制。如果您只想复制当前节点(规范中的“上下文项目”),请使用它。 xsl:copy-of是一种深复制。如果您想要复制当前节点下的完整节点树,请使用它。有关更详细和完整的解释,请阅读从第一个评论中链接到的规范。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接