[xquery-talk] variable references in location steps
Jens Teubner
jens.teubner at inf.ethz.ch
Fri Feb 25 09:16:49 PST 2011
On Fri, Feb 25, 2011 at 02:17:13AM +0100, Ron Van den Branden wrote:
> let $test :=
> <test>
> <a><el1/></a>
> <b><el2/></b>
> </test>
> let $el1 := $test//el1
> let $el2 := $test//el2
> return
> <result>
> <step>
> <el1.a>{$test//a//$el1}</el1.a>
>
> [...]
Ron,
I guess what is confusing you here is the semantics of the (binary) ‘/’
operator in XQuery. ‘/’ does not itself evaluate any XPath axes.
Rather, it establishes the proper context for successive XPath
navigation steps. In fact, ‘/’ is almost like a ‘for’ iteration
primitive, only that it has special typing rules and that it does
duplicate elimination afterward.
To illustrate,
let $foo := (<a/>, <b/>, <c/>)
return
$foo/42
will return (42, 42, 42), because you iterate over $foo (three
iterations) and for each iteration 42 is returned.
Conversely, in
let $foo := (<a/>, <b/>, <c/>)
let $bar := (<x/>, <y/>)
return
$bar/$foo
you iterate over $bar (i.e., two iterations), and for each iteration
$foo is returned (think of (<a/>, <b/>, <c/>, <a/>, <b/>, <c/>) as an
intermediate result). Now, since $foo is a list of nodes, the ‘/’
operator performs duplicate elimination and the result of this query is
(<a/>, <b/>, <c/>).
Now to your query: You seem to be interested only in the tag name of the
nodes in your variables. What you could try is something like
<el2.a>{$test//a//*[name() = $el2/name()]}</el2.a>
(sorry, I have abused the ‘/’ here myself).
Best regards,
Jens
(I didn't actually run any of the above queries. Please bear with me if
they produce errors.)
--
Jens Teubner
ETH Zurich, Systems Group
Universitaetstrasse 6 / CAB E 77.1
8092 Zurich, Switzerland
XQuery processing at the speed of light: MonetDB/XQuery
http://www.monetdb-xquery.org/ http://www.pathfinder-xquery.org/
More information about the talk
mailing list