<xsl:sequence>
アトミック値(またはアトミック値のシーケンス)は、<xsl:copy-of>
両方が入力のコピーを返すのと同じです。違いは、ノードを検討するときに発生します。
$ nが単一要素ノードの場合、たとえば次のようなもので定義されている場合
<xsl:variable name="n" select="/html"/>
それで
<xsl:copy-of select="$n"/>
ノードのコピーを返します。名前と子の構造は同じですが、新しいIDを持つ(親がない)新しいノードです。
<xsl:sequence select="$n"/>
ノード$nを返します。返されたノードは$nと同じ親を持ち、is
Xpath演算子によってそれと等しくなります。
従来の(XSLT 1スタイル)テンプレートの使用法では、どちらの操作の結果にもアクセスできないため、違いはほぼ完全にマスクされます。コンストラクターの結果は暗黙的xsl:sequence
に出力ツリーにコピーされるため、コピーを作成しないという事実はマスクされます。 。
<xsl:template match="a">
<x>
<xsl:sequence select="$n"/>
</x>
</xsl:template>
と同じです
<xsl:template match="a">
<x>
<xsl:copy-of select="$n"/>
</x>
</xsl:template>
どちらも新しい要素ノードを作成し、コンテンツの結果を新しいノードの子としてコピーx
します。
ただし、関数を使用すると、違いがすぐにわかります。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="data:,f">
<xsl:variable name="s">
<x>hello</x>
</xsl:variable>
<xsl:template name="main">
::
:: <xsl:value-of select="$s/x is f:s($s/x)"/>
:: <xsl:value-of select="$s/x is f:c($s/x)"/>
::
:: <xsl:value-of select="count(f:s($s/x)/..)"/>
:: <xsl:value-of select="count(f:c($s/x)/..)"/>
::
</xsl:template>
<xsl:function name="f:s">
<xsl:param name="x"/>
<xsl:sequence select="$x"/>
</xsl:function>
<xsl:function name="f:c">
<xsl:param name="x"/>
<xsl:copy-of select="$x"/>
</xsl:function>
</xsl:stylesheet>
生産する
$ saxon9 -it main seq.xsl
<?xml version="1.0" encoding="UTF-8"?>
::
:: true
:: false
::
:: 1
:: 0
::
ここでは、xsl:sequence
との結果xsl:copy-of
が根本的に異なります。