## RE: RE: [xsl] Selecting the first node set

 Subject: RE: RE: [xsl] Selecting the first node set From: Wendell Piez Date: Tue, 15 Aug 2006 14:22:57 -0400
Hi,

At 11:07 AM 8/15/2006, Charles wrote:
I find it easier to think of things visually (I always did well in geometry but stumbled in algebra). What we're really working with is the notion of sets, so I think of a Venn diagram. I picture this:

"x | y[1]"

as "The set of all x-things and the first y-thing."

Right. In XPath, "|" is the union operator: it takes two node-set operands and returns a node-set unifying them.

Note that since these are the nodes themselves, the union (\$n | \$n) is the same as \$n.

These can lead to some funny stuff in XPath 2.0, where we no longer have node sets but instead, sequences of items. So in XPath 2.0 we can say (\$s, \$s) and have a sequence of all the items in \$s (which may include nodes, or rather, references to nodes) followed by all the items in \$s again. (There is no ',' operator in XPath 1.0.)

The union operator in XPath 2.0, also "|", is designed so that (a) it tosses duplicate references to the same nodes, and (b), it sorts the nodes into document order in the resulting sequence, so it effectively works the same as "|" in XPath 1.0 although it's technically a different thing.

and this:

"(x | y)[1]"

as "The first element of the set of all x-things and all y-things."

Right. But note that since sets don't formally have order, an order must be imposed for this to make sense. In XPath 1.0, document order is referred to except in certain special cases (the famous reverse axes).

In XPath 2.0, since sequences do have order, the expression (\$s, \$s)[1] will get you the first item of the sequence \$s, just once, or nothing at all if \$s is empty. Hence (\$a, \$b)[1] is a neat way of providing a default in XPath 2.0, since if \$a is empty the first item in \$b will be provided.

```Cheers,