'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
从可能不同的节点和原始类型组装有序列表。