XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
David LeeSubject: 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.

Any ideas ?

Postnext
(Deleted User) 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.

Thanks,
Alberto

Posttop
David LeeSubject: 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

<bookmark name="{$a/root()//aml:annotation[@aml:id=$a/@aml:id][@w:type="Word.Bookmark.Start"]/@w:name}"/>
else
()
};

 
Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.