Lately I’ve been playing with some more advanced XQuery. One thing nearly every XQuery engine supports is some kind of
eval() function. MarkLogic has several, but my favorite is xdmp:eval. It’s lightweight because it reuses the entire calling context, so for instance you can write
let $v := 5 return xdmp:value("$v"). Not too useful, but if the expression passed in comes from a variable, it gets interesting.
Now, quite a few standards based on XPath depend on the context node being set to some particular node. This turns out to be easy too, using the path operator:
$context/xdmp:value($expr). According to the definition of the XPath path operator, the expression to the right is evaluated with the results of the expression on the left setting the context node.
OK, how about setting the context size and position? More difficult, but one could use a sequence on the left-hand side of the path operator, with the desired
$context node in somewhere in the middle. Then
last() will return the length of the sequence, and
position() will return, well, the position of
$context in the sequence. But it’s kind of hacky to manufacture a bunch of temporary nodes, only to throw them away in the next step of the path.
I’m curious if anyone else has done something similar. Comments? -m