W3C home > Mailing lists > Public > public-xml-processing-model-wg@w3.org > March 2007

Re: In-scope namespaces and parameter values

From: Jeni Tennison <jeni@jenitennison.com>
Date: Mon, 12 Mar 2007 10:27:15 +0000
Message-ID: <45F52B03.8060703@jenitennison.com>
To: public-xml-processing-model-wg@w3.org


Norman Walsh wrote:
> On the last call, Alex asked about making sure that the in-scope
> namespaces were kept with each p:parameter so that it would be
> possible for steps to interpret QNames in values correctly.
> I can't think of a good way to make this work.
> In particular, I don't know of any APIs that allow you to do this.
> Consider
>   <p:xslt>
>     <p:parameter name="foo" value="x:foo" xmlns:x="XXX"/>
>     <p:parameter name="bar" value="x:bar" xmlns:y="YYY-NOT-XXX"/>
>   </p:xslt>
> Does anyone know of an XSLT engine which accepts a set of parameters
> with different in-scope namespaces for each parameter?

I think we have a problem here, but I don't think this is it. The XSLT 
(2.0) *component* needs to know the in-scope namespaces so that it can 
interpret *options* such as initial-mode/initial-template QNames 
correctly and pass both namespace URI and local name to the XSLT 
processor. But the XSLT (2.0) *processor* itself doesn't get passed 
in-scope namespaces: the values of *parameters* are just strings.

We can say that when a component is invoked it is provided with, for 
each option, a name, a (string) value, and a set of in-scope namespaces. 
The component will know which of the options need to be interpreted as 
QNames, for passing to the processor, and which don't.

For example, if you have:

   <p:xslt2 xmlns:my="http://www.example.com/ns/my">
     <p:option name="initial-template" value="my:main" />

the component knows that the initial-template option has a QName value, 
and therefore uses the in-scope namespaces that it's passed in order to 
interpret them.

This is the same as (on the Saxon command line) doing:

   -it {http://www.example.com/ns/my}main

The problem is that if I put a pipeline wrapper around my invocation, I 
might well end up with different namespaces in scope in the invocation 
of the XSLT component (which knows that the initial-template option is a 
QName) and the invocation of the pipeline (which doesn't). For example, 
I invoke my wrapper with this:

<my:wrapper xmlns:ex="http://www.example.com/ns/bar">
   <p:option name="transform-initial-template"
             value="ex:main" />

intending the value 'ex:main' to be interpreted with the namespace 
'http://www.example.com/ns/bar'. The definition of my:wrapper is:

<p:pipeline name="my:wrapper"
   <p:option name="transform-initial-template" />
     <p:option name="initial-template"
       select="$transform-initial-template" />

and the in-scope namespaces on the initial-template option associate the 
prefix 'ex' with 'http://www.example.com/ns/foo', and the wrong template 
is called (or more likely an error occurs).

I guess there are three possibilities:

1. We have a way of saying that particular options are QNames when 
they're declared (and the in-scope namespaces used to interpret them 
when the component is invoked):

<p:pipeline name="my:wrapper"
   <p:option name="transform-initial-template" as="xs:QName" />
     <p:option name="initial-template"
       select="$transform-initial-template" />

2. We use a non-QName syntax for options that are qualified names, e.g.:

     <p:option name="initial-template"
               value="{http://www.example.com/ns/my}main" />

3. We accept that it's a theoretical problem, and put a warning in the 
spec about it, but don't worry about it because it'll hardly ever 
actually be a practical problem (since people tend to be consistent in 
their use of prefixes).

I'm inclined to do the last, since with the first two the cure is worse 
than the disease (plus they're only practical with values that are 
actually QNames, not for values that are lists of QNames or XPaths or 
any other kind of value that contains QNames).


Jeni Tennison
Received on Monday, 12 March 2007 10:27:42 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:32:42 UTC