Re: three questions regarding library modules

Mark D. Anderson wrote:

> 1. Section 4.12 of WD-xquery-20040723 indicates that a library module
> can only declare variables in its own namespace, and that
> unprefixed variables can only be declared in a main module.
> 
> But what does this mean about using unprefixed variables in a
> library module?
> If a main module has:
> 
> declare variable $mainvar = 'fred';
> import module foo = "http://whatever.org/modules/foo" at "foo.xq";
> 
> Should foo.xq allow:
> 
> module namespace foo = "http://whatever.org/modules/foo";
> declare function foo:getmain() {$mainvar};

foo.xq has no way to import the main module. If you aren't a library 
module, you can't be imported. So there's no way for foo.xq to get 
access to $mainvar.

foo.xq can only declare variables in its own namespace, and can only get 
access to variables in other modules by importing them - and these 
variables will be namespace qualified.

I'm ignoring the word 'unprefixed' - the prefixes don't really matter, 
it is namespace qualification that is important. Earlier versions of the 
spec seemed to imply that the prefixes were what counts, but I hope 
we've got that consistently fixed now.

> 2. I am similarly confused by section 4.11.
> Should a library module be able to use a namespace declared
> in a main module?
> Is it legal for it to provide its own definition?
> 
> An example main module might be:
> 
> declare namespace bar = "http://whatever.org/namespaces/bar";
> import module foo = "http://whatever.org/modules/foo" at "foo.xq";
> 
> and foo.xq would then be:
> 
> module namespace foo = "http://whatever.org/modules/foo";
> (:declare namespace bar = "http://whatever.org/namespaces/bar";:)
> declare function foo:getbar() {<bar:root/>};

A library module has no idea what has or has not been declared in a main 
module, and you can compile a library module separately in some 
implementations. So yes, there's no problem with declaring the same 
namespace in a main module and a library module.

> 3. In section .43, I'm unclear as to whether the "local" prefix
> is legal in a library module. It says:
> 
>     In order to allow main modules to declare functions for local use
>     within the module
>     without defining a new namespace, XQuery predefines the namespace
>     prefix local to
>     the namespace http://www.w3.org/2004/07/xquery-local-functions, and
>     reserves this namespace for use in defining local functions.
> 
> I hope this doesn't mean that it is impossible/illegal to define
> local functions in a library module.

Local functions (and variables) are obviously useful, but we don't have 
them in XQuery 1.0. Since every function and variable declared in a 
module must be qualified by the module's target namespace, you can't use 
the local prefix, which would put it in a different namespace.

You could try asking us to consider local functions and variables as a 
new feature, but this has been considered several times and has always 
failed so far.

I hope this is helpful and answers your questions.

Jonathan

Received on Tuesday, 17 August 2004 13:17:15 UTC