Subject:root() vs // - saxon and builtin differ ... why ? Author:David Lee Date:19 Oct 2006 11:23 AM
Here's a function which tries to find the coresponding Start bookmark given an End bookmark. The coresponding start bookmark node can occur anywhere in the document.
declare function local:annotation( $a as element(aml:annotation)* ) as node()?
{
if( $a/@w:type="Word.Bookmark.End") then
<bookmark name="{//aml:annotation[@aml:id=$a/@aml:id][@w:type="Word.Bookmark.Start"]/@w:name}"/>
else
()
}
When I run this with Saxon processor I get Error <line file> ... XPDY0002: Cannot select a node here: the context item is undefined.
But with builtin it works fine !!!
Now I rewrite as
declare function local:annotation( $a as element(aml:annotation)* ) as node()?
{
if( $a/@w:type="Word.Bookmark.End") then
<bookmark name="{$a/root()/aml:annotation[@aml:id=$a/@aml:id][@w:type="Word.Bookmark.Start"]/@w:name}"/>
else
()
}
This works in both saxon and builtin !!
Why is it saxon cant evaluate // in a function but builtin can ? It sorta makes sense because in a function it doesnt know what document your using ... but seems very weird.
Subject:Re: root() vs // - saxon and builtin differ ... why ? Author:(Deleted User) Date:19 Oct 2006 11:33 AM
Hi David,
according to the specs, the context item is undefined inside a
user-defined function, so you cannot use expressions like ., / or //.
So, Saxon is right, while the built-in processor doesn't enforce this.
Subject:root() vs // - saxon and builtin differ ... why ? Author:David Lee Date:19 Oct 2006 11:45 AM
Thanks, this makes perfect sense. Since I'm ultimately going to be running using Saxon I'll enjoy its stricter checking.
FYI, for future readers, I made a mistake in the above, here's the working function (it parses AND produces the correct results)
(: construct bookmark tags from annotations :)
declare function local:annotation( $a as element(aml:annotation)* ) as node()?
{
if( $a/@w:type="Word.Bookmark.End") then