[xquery-talk] variable references in location steps

Ron Van den Branden ron.vandenbranden at kantl.be
Fri Feb 25 02:17:13 PST 2011


Hi,

I'm trying to optimize a complex XQuery expression by defining variables 
for reused context nodes. Until recently, I assumed that those variable 
references could be used in location steps as substitution for the nodes 
they hold, but apparently it doesn't work exactly like that. I'll try to 
clarify with following XQuery (note: I realize this question is 
XPath/XSLT related, but since the practical angle is XQuery-oriented, 
I'll post it here.):

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>
       <el2.a>{$test//a//$el2}</el2.a>
       <el1.b>{$test//b//$el1}</el1.b>
       <el2.b>{$test//b//$el2}</el2.b>
     </step>
     <predicate>
       <a.el1>{$test//a[.//$el1]}</a.el1>
       <a.el2>{$test//a[.//$el2]}</a.el2>
       <b.el1>{$test//b[.//$el1]}</b.el1>
       <b.el2>{$test//b[.//$el2]}</b.el2>
     </predicate>
   </result>

Developing against the eXist XML database, I assumed that the queries in 
<el1.a> and <el2.b> would only return the <el1> and <el2> elements in 
their respective contexts, while <el2.a> and <el1.b> would return 
nothing. Instead, they all return the respective <el1> and <el2> 
elements, even for context nodes in which they don't occur (see <el2.a> 
and <el1.b>). Later I found out that the variable used in this last 
location step doesn't resolve to the nodes it contains, but instead is 
interpreted as a filter, which consequently returns the entire nodeset 
held in the $el1 and $el2 variables (see Jeni Tennison's clarification 
at <http://markmail.org/message/hss4auv23t6y2ep2>). Note: my assumption 
came from my experience with the eXist XML database to filter down 
ancestor nodes containing other nodes by means of a variable reference 
in a predicate: see the queries in the <predicate> section. In eXist, 
only <a.el1> and <b.el2> return the respective <a> and <b> elements, 
while <a.el2> and <b.el1> are empty, which suggests that in this case 
the variable reference is resolved to the nodes it contains. However, 
this behaviour apparently differs from Saxon's which also returns the 
<a> and <b> nodes in <a.el2> and <b.el1>.

Assuming Saxon is right, this makes me wonder: is my thinking based on 
an incorrect implementation, or *is* there a way to make use of variable 
references for filtering down nodesets in location steps?

Any help much appreciated!

Kind regards,

Ron Van den Branden

-- 
Ron Van den Branden
Wetenschappelijk attaché / Senior Researcher
Reviews Editor LLC. The Journal of Digital Scholarship in the Humanities

Centrum voor Teksteditie en Bronnenstudie - CTB (KANTL)
Centre for Scholarly Editing and Document Studies
Koninklijke Academie voor Nederlandse Taal- en Letterkunde
Royal Academy of Dutch Language and Literature
Koningstraat 18 / b-9000 Gent / Belgium
tel: +32 9 265 93 51 / fax: +32 9 265 93 49
E-mail : ron.vandenbranden at kantl.be
http://www.kantl.be/ctb



More information about the talk mailing list