'xsl:copy-of'和'xsl:sequence'有什么区别
答案 0 :(得分:3)
xsl:copy-of select="expression"
求值expression
并创建该表达式求值序列的深层副本,而xsl:sequence select="expression"
求值expression
并返回该表达式求值的序列。
取决于您使用指令的位置,这意味着例如使用<xsl:sequence select="doc('file.xml')//foo"/>
从文件中返回foo
元素的序列,而函数中的<xsl:copy-of select="doc('file.xml')//foo"/>
从文件中返回foo
元素的副本。
只要输出到结果树,通常使用一个或另一个都不重要,但是如果选择输入节点并希望保留它们又不想浪费内存,通常使用xsl:sequence
而不是xsl:copy-of
更有效率。
答案 1 :(得分:3)
这里与示例有明显的区别。
此样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:variable name="vCopy" as="document-node()">
<xsl:copy-of select="."/>
</xsl:variable>
<xsl:variable name="vSequence" as="document-node()">
<xsl:sequence select="."/>
</xsl:variable>
<xsl:sequence select="generate-id(.),
generate-id($vCopy),
generate-id($vSequence)"/>
</xsl:template>
</xsl:stylesheet>
它与任何输入源一起输出类似于:
d2047 d2048d2047 d2047
注意:xsl:sequence
保留节点标识,xsl:copy
创建一个新节点。
答案 2 :(得分:2)
在很多情况下,它们是可互换的。一个区别是xsl:copy-of具有更多选项(验证,副本命名空间等)。但是大多数时候您都可以使用。
正式的区别在于xsl:copy-of
创建新节点,而xsl:sequence
返回对现有节点的引用。这很重要,例如,如果在结果上使用“ is”运算符,或者使用generate-id(),或者在子树之外导航(例如,到复制节点的父节点)。
可以公平地说,人们有90%的时间优先使用xsl:copy-of
而不是xsl:sequence
,因为这是您在XSLT 1.0中所做的,而不是因为他们真的想要复制。
答案 3 :(得分:0)
xsl:copy-of
将所选项目复制为深层副本。
xsl:sequence
用于构造节点和/或原子值的有序列表。
因此,使用xsl:copy-of
制作输入文档中存在的节点的深层副本;使用xsl:sequence
从可能不同的节点和原始类型组合一个有序列表。