'xsl:copy-of'和'xsl:sequence'有什么区别?

时间:2019-08-02 12:20:39

标签: xml xslt

'xsl:copy-of'和'xsl:sequence'有什么区别

4 个答案:

答案 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从可能不同的节点和原始类型组合一个有序列表。