- From: Norman Walsh <ndw@nwalsh.com>
- Date: Wed, 06 Jun 2007 13:16:02 -0400
- To: public-xml-processing-model-wg@w3.org
- Message-ID: <878xaxovfx.fsf@nwalsh.com>
This proposal is my proposal from a few days ago adjusted to address
the comments made by Alex, Henry, and Jeni.
1. No more automatic inheritance. Consequently, remove parameters
from compound steps.
2. Add a grouping mechanism, a la XSLT attribute sets:
<p:parameter-set
name = NCName>
(p:inline|p:pipe|p:document|p:parameter*)
</p:parameter-set>
For V1, I propose that p:parameter-set be allowed only as a child
of p:pipeline.
If the same parameter is specified more than once inside a
p:parameter-set, the last value specified is used.
Having sets isn't very useful if you can't use them, so we also
need @use-parameter-sets on steps. (For steps not in the pipeline
namespace, that's spelled @p:use-parameter-sets.)
If more than one parameter set is named in a
use-parameter-sets, then the parameters from each set are
merged, in the order specified. In the case of duplicate
names, the last value is used.
Consider:
<p:parameter-set name="seta">
<p:parameter name="aname" value="1"/>
<p:parameter name="pname" value="foo"/>
</p:parameter-set>
<p:parameter-set name="setb">
<p:parameter name="bname" value="2"/>
<p:parameter name="pname" value="bar"/>
</p:parameter-set>
<p:xslt use-parameter-sets="seta setb">
...
<p:xslt>
The parameters passed to the XSLT step are:
aname=1
bname=2
pname=bar
If use-parameter-sets="setb seta" had been specified, then
the parameters passed would have been:
aname=1
bname=2
pname=foo
The ability to group parameters gives the pipeline author control
over all the parameters *except* those that are passed to the
pipeline (either by the application, e.g., from the command line
or by the invocation of the pipeline from some other pipeline).
I propose that we address that by allowing "#top-level" as a
parameter set name. It means "all the parameters passed to the
p:pipeline", which might be the empty set.
Users can merge parameter sets by specifying
use-parameter-sets on a p:parameter-set element. Users can
control whether the "used value" or the "declared value" has
priority by specifying inherit=yes|no on the p:parameter. The
default is 'yes'.
Using sets 'seta' and 'setb' from above:
<p:parameter-set name="setc" use-parameter-sets="seta">
<p:parameter name="aname" value="3"/>
</p:parameter-set>
results in aname=1 in 'setc'. Conversely:
<p:parameter-set name="setd" use-parameter-sets="seta">
<p:parameter name="aname" value="3" inherit='no'/>
</p:parameter-set>
results in aname=3 in 'setd'. The inherit attribute has no effect
if there is no duplication.
This feature gives pipeline authors control over whether parameters
passed in the '#top-level' set (over which they have no control) are
more or less important than the values they set explicitly.
3. If a p:inline, p:pipe, or p:document occurs inside a
p:parameter-set, it must produce a sequence of c:parameter
documents. It is a dynamic error if anything else appears.
Each c:parameter document must consist of:
<c:parameter
name = string
namespace? = anyURI
value = string/>
If name has the lexical form of an NCName then, if namespace
is specified, then it is a QName in that namespace, otherwise
it is in no namespace. If name is not an NCName then it must
have the lexical form of a QName. If it has the lexical form
of a QName, then the namespace bindings associated with the
c:parameter element are used to evaluated it. It is a dynamic
error if name contains a colon and namespace is specified.
It is a dynamic error if a p:pipe points to a step
that (directly or indirectly) uses the parameter set being
defined.
4. One case that we expect to be common is that a pipeline has no
explicit parameters but that user-specified top-level
parameters should be passed to steps.
In order to achieve this, we say that the default value of
use-parameter-sets (or p:use-parameter-sets) on a step is
"#top-level".
5. In order to give the pipeline access to the top level parameters,
we add a new step:
<p:declare-step type="p:parameters">
<p:output port="result" sequence="yes" />
</p:declare-step>
This step produces on its output port a sequence of
c:parameter documents, one for each parameter passed to it. By
point 4 above, this will by default be the #top-level
parameters, though pipeline authors will be free to use this
for other sets.
The c:parameter elements produced by this step always have names
that are NCNames.
What does this mean?
Consider the simplest case:
<p:pipeline>
...
<p:xslt>
<p:input port="source">...</p:input>
<p:input port="stylesheet">...</p:input>
</p:xslt>
</p:pipeline>
Today, any parameters passed to the pipeline are automatically
available to the XSLT step. To obtain that behavior under this
proposal, no changes would have to be made to the pipeline!
If there were any legacy pipelines, and those legacy pipelines
relied on parameters set on p:group elements scoping the
parameters used inside the group, they'd have to be changed from:
<p:pipeline>
...
<p:group>
<p:option name="baz" select="concat($moo,'-1')"/>
<p:parameter name="foo" value="bar"/>
<p:xslt>
<p:input port="source">...</p:input>
<p:input port="stylesheet">...</p:input>
<p:parameter name="base-name" select="$baz"/>
</p:xslt>
<px:something-else/>
</p:group>
</p:pipeline>
to something like this:
<p:pipeline>
<p:parameter-set name="group1" use-parameter-sets="#top-level">
<p:parameter name="foo" value="bar"/>
</p:parameter-set>
...
<p:group>
<p:option name="baz" select="concat($moo,'-1')"/>
<p:xslt use-parameter-sets="group1">
<p:input port="source">...</p:input>
<p:input port="stylesheet">...</p:input>
<p:parameter name="base-name" select="$baz"/>
</p:xslt>
<px:something-else p:use-parameter-sets="group1"/>
</p:group>
</p:pipeline>
Pipelines that need to perform more complex computations can do so:
<p:pipeline>
<p:parameter-set name="global">
<p:pipe port="result" step="load-global"/>
<p:pipe port="result" step="some-top-level"/>
</p:parameter-set>
<p:try name="load-global">
<p:group>
<p:output port="result"/>
<p:load>
<p:option name="href" value="~/.globals.xml"/>
</p:load>
</p:group>
<p:catch>
<p:output port="result"/>
<p:identity>
<p:input port="source">
<p:inline>
<c:parameters/>
</p:inline>
</p:input>
</p:identity>
</p:catch>
</p:try>
<p:parameters use-parameter-sets="#top-level"/>
<p:matching-documents name="some-top-level">
<p:option name="test" value="@namespace = 'http://example.com/'"/>
</p:matching-documents>
<p:xslt use-parameter-sets="global #top-level">
...
</p:xslt>
</p:pipeline>
I believe this proposal will satisfy Alex, Henry, Jeni, and
myself, at least!
Be seeing you,
norm
--
Norman Walsh <ndw@nwalsh.com> | To buy books would be a good thing if
http://nwalsh.com/ | we could also buy the time to read
| them; as it is, the mere act of
| purchasing them is often mistaken for
| the assimilation and mastering of their
| content.-- Schopenhauer
Received on Wednesday, 6 June 2007 17:16:11 UTC