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

  • 本文关键字:xsl 区别 sequence copy-of xml xslt
  • 更新时间 :
  • 英文 :


'xsl:xsl'和'xsl:sequence'

之间有什么区别

在很多情况下它们是可以互换的。一个区别是XSL:副本具有更多选项(验证,复制名称空间等(。但是大多数时候您都可以使用。

xsl:copy-of创建新节点,而xsl:sequence返回对现有节点的引用。重要的是,例如,如果您在结果上使用"是"运算符,或者是否使用generate-id((,或者如果您在子树外面导航(例如,转到复制节点的父(。

公平地说,90%的时间人们使用xsl:copy-of优先使用xsl:sequence,因为这是您在XSLT 1.0中所做的,不是因为他们真的想要制作副本。

xsl:copy-of select="expression"评估 expression,并创建评估为表达式的序列的深副本,而 xsl:sequence select="expression"评估了 expression,并返回了评估的序列。

取决于您使用的指令的位置,例如使用e.g的函数。<xsl:sequence select="doc('file.xml')//foo"/>从文件中返回文件中的foo元素,而该功能中的<xsl:copy-of select="doc('file.xml')//foo"/>从文件中返回foo元素的副本。

只要您输出到结果树,通常不论您使用一个或另一个都没有关系,但是如果您选择输入节点并想要保留它们,并且也不想浪费内存使用xsl:sequence而不是xsl:copy-of

更有效

在这里您与示例有明显的区别。

此样式表:

<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

do Note xsl:sequence保留节点身份,xsl:copy创建一个新节点。

xsl:copy-of将选定的项目复制为深副本。

  • 另请参阅XSL:副本和XSL:副本?
  • 之间有什么区别?

xsl:sequence用于构建节点和/或原子值的有序列表。

因此,使用xsl:copy-of进行输入文档中存在的节点的深层副本;使用xsl:sequence从可能不同的节点和原始类型组装有序列表。

最新更新