[xquery-talk] Paths, node sorting & node constructors

Michael Kay mike at saxonica.com
Sat Mar 15 11:13:09 PST 2008


> One thing with XQuery that I am constantly tripping over in 
> XQuery is that the result of sorting constructed elements is 
> undefined. Consider this:
> 
> 	path/(<h3>{...}</h3>,
> 	      <p>{...}</p>)
> 
> 
> So what can one recommend users to do? To go away from 
> XPath-style, and use a for loop instead?
> 

Yes, I think using element constructors on the rhs of "/" is best avoided.

For a time I took to using $var/(long expression) as a way of causing (long
expression) to be evaluated
with $var as the context node. For example:

declare function copyCustomer ($c) {
  $c/
   <partner>
     <name>{@name}</name>
     <address>{address}</address>
   </partner>
}

But the document ordering semantics of "/" make this too dangerous. It works
in this case, but fails in many others.

XQuery desperately needs a "simple mapping operator": something that's like
a "for", but setting the context item rather than a variable, and without
any ordering semantics. This came up again and again during WG discussions,
but got defeated every time - partly because no one could find a way of
writing the operator that everyone liked. In fact, in the early days before
some of the XQuery WG members fully understood XPath, they wanted "/" to be
that operator - but of course that's incompatible with its existing usages.

Michael Kay
http://www.saxonica.com/

M



More information about the talk mailing list