[xquery-talk] some ... satisfies with positional variable
Michael Kay
mhk at mhk.me.uk
Sat Aug 20 08:58:21 PDT 2005
>
> Here's a question about an XQuery language construct I would
> appreciate.
You seem to be overlooking that XQuery has XPath as a subset. These queries
can all be expressed by simple and efficient XPath 1.0 expressions.
>
> in for-clauses it is possible to include a positional
> variable and return
> the context node $fs:dot - or any other node - based on the
> position of
> its child elements.
>
> for $x at $pos in child::tag0 return
> if ($pos > 3) then return $fs:dot
>
> If the context node has more than 4 children, the above
> expression will
> return it more than once. This could be avoided by wrapping
> the result in
> a distinct-doc-order function, but it wouldn't prevent the
> compiler from
> executing extra work, does it?
You seem to be searching for the expression
(.)[tag0[4]]
(The parentheses are needed in XPath 1.0 but not in XPath 2.0)
Any decent XPath processor is going to execute this very efficiently.
>
> Without positional variables extra work can be evaded by
> using the some
> ... satisfies ... clause:
>
> if (some $x in child::* satisfies (fn:node-name($x) == "tag2")))
> then $fs:dot
> else ()
Actually, you want "=" or "eq" rather than "=="; and node-name() returns a
QName not a string. Rather than getting a node-name as a run-time string or
QName, it's better to do ($x[self::tag2]).
>
> This works fine, but I cannot include a positional variable in the
> conditional. What I need is a "some ... at ... in ... satisfies ... "
> construct similar to the following:
>
> epxr1 =
>
> if (some $x at $pos in child::* satisfies ($pos > 3))
> then $fs:dot
> else ()
Again, you're forgetting positional predicates: you can write this as
if (child::*[position() gt 3])
or more simply
if (*[4]) then . else ()
or just
.[*[4]]
>
> But this is not provided by XQuery. XPath expressions won't help since
> they're normalized to for, if-clauses, etc.
That's an odd way of looking at the world: XPath expressions like the ones
above have been around since 1999, long before for expressions and if
clauses were invented.
Michael Kay
More information about the talk
mailing list