Re: [xsl] Re: Re: order of UNIONs

Subject: Re: [xsl] Re: Re: order of UNIONs
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Thu, 15 Nov 2001 15:05:49 +0000
Dimitre wrote:
> I think one of the major problem of the XPath 2.0 Data Model is that
> they do not distinguish between lists and sets, trying somehow to
> say that a node-set is a kind of list (the actual term used there
> was "sequence", if I remember well). The consequences are bad
> problems, because some operations on lists cannot be performed 1:1
> on sets, and vice versa -- not every list is a set, an operation
> performed on a sequence, that is a nodeset, may not yield a nodeset,
> a nodeset operation performed on a sequence that is a nodeset, may
> behave quite differently from the same operation, performed on a
> sequence (e.g. eliminating/preserving duplicates on a union/append
> operation).

In a way I'm quite looking forward to having node sequences rather
than node sets, since it's a frequent trap that beginners fall into,
and it will one less thing for David to get mathematical about ;)

>From what I can see in the XQuery/XPath WDs, it doesn't look as though
there will be a concept of 'sets' in XPath 2.0. My guess is that a
location path will return a sequence in document order. The xf:union()
function is defined as returning a sequence of unique nodes in
document order. It's a distinct operation from the , operator for
appending one sequence to another. So:

  {$item1, $item2} | {$item1} => {$item1, $item2}
  {$item1, $item2} , {$item1} => {$item1, $item2, $item1}

I haven't noticed anything where, when manipulating node sequences in
the same way as you currently construct node sets, things work
differently from the way they would if you were actually working with
node sets, though I might be missing something and there's nothing in
either WD about how you will actually select nodes using location
paths in XPath 2.0.

As written, xf:identity-distinct() converts a node sequence containing
duplicates to one that doesn't, but to get something that works in the
same way as a node set, you'd have to union the sequence with itself
(as above) or use xf:sort() (though I don't think that should be a
function in any case).

The other relevant function is xf:unordered(), which acts as a 'hint'
to the processor that the sequence can be treated as unordered. I
don't really understand when you'd use that, though, I must admit.



Jeni Tennison

 XSL-List info and archive:

Current Thread