xsl-list
[Top] [All Lists]

Re: XSLT 2.0: On xsl:sequence and xsl:copy-of

2003-10-10 12:52:23
Now that everything is a sequence in
XPath 2.0, the word sequence has become a buzz word and its
overuse (not to say misuse) can only lead to confusion. If
the result of this instruction is placing references to nodes
in the output, then a more exact name would be one of the
following:

    xsl:reference

    xsl:add-reference

    xsl:node-reference

None of these are suitable, because xsl:sequence can produce any
sequence of nodes and/or atomic values.

That means xsl:reference describes all of these cases.



  O2. xsl:sequence does everything that can be done with
xsl:copy-of and these two xslt instructions are mutually redundant.

There is certainly an overlap. With atomic values, they do the same
thing. And it's true that in some contexts, nodes returned be
xsl:sequence are going to get copied anyway, to add them to a new tree.
But returning a node and making a copy of a node are rather different
things.

Yes, but when we'll need a copy of a node and having a reference will not
do?

Using a copy may make sense if what is copied could change in time -- but
XSLT is a functional language and this is not possible.


  Q1. Is there anything that can be accomplished with
xsl:copy-of and which cannot be accomplished by using xsl:sequence?

At this time of a Friday night, I can't immediately recall what the use
case was. Some of the examples we looked at involved validation.

I think that many people in this list would be interested to have a look
too. Could you, please, give us such an example whenever you have the time?


  Q3. Let's have:

    <xsl:variable name="v1">
      <xsl:sequence select="/"/>
    </xsl:variable>
    <xsl:variable name="v2">
      <xsl:sequence select="/"/>
    </xsl:variable>

    <xsl:copy-of select="$v1 except $v2"/>

Should the output of this code be empty or not? If not, what
should the output be?

xsl:variable without an "as" attribute constructs a temporary tree, so
in this context xsl:sequence has the same effect as xsl:copy-of. You are
constructing two different trees containing distinct nodes, so ($v1
except $v2) returns $v1.


Then a slight modification:

    <xsl:variable name="v1" as="item()*">
      <xsl:sequence select="/"/>
    </xsl:variable>
    <xsl:variable name="v2"  as="item()*">
      <xsl:sequence select="/"/>
    </xsl:variable>

    <xsl:copy-of select="$v1 except $v2"/>

I guess this will not produce any output -- am I right?


My last question is the following:

In the example above the two sequences consist not of nodes, but of
*references to nodes*. This is a very useful new datatype, not present in
the XPath data model. Will it not be nice to explain this in detail in the
XSLT spec.?


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list