- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Wed, 06 Jun 2007 20:07:54 +0100
- To: public-xml-processing-model-wg@w3.org
I think we're getting there. A few more comments from me.
Norman Walsh wrote:
> 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.
Is it allowed between steps or only before the subpipeline? I think the
latter will be hard to use, so I hope it's the former.
In fact, I'm not all that convinced that parameter sets will get much
reuse, so rather than forcing people to do:
<p:pipeline ...>
...
<p:parameter-set name="my-xslt-parameters">
<p:pipe step="foo" source="result" />
<p:parameter name="view" value="default" />
</p:parameter-set>
...
<p:xslt use-parameter-sets="my-xslt-parameters">
...
</p:xslt>
</p:pipeline>
I think we should allow:
<p:pipeline ...>
...
<p:xslt>
...
<p:parameter-set>
<p:pipe step="foo" source="result" />
<p:parameter name="view" value="default" />
</p:parameter-set>
</p:xslt>
</p:pipeline>
The proximity of the construction of the parameter set and the use of
the parameter set will help users.
[In fact, I think that <p:parameter-set> could be removed from the
<p:pipeline> context: if you want to share parameter sets, you can
always create a sequence of <c:parameter> documents to hold them.]
> 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.)
I have a strong preference for using a nested syntax rather than an
attribute for constructing the parameter set from other parameter sets.
In other words, rather than:
<p:parameter-set name="setc" use-parameter-sets="seta">
<p:parameter name="aname" value="3"/>
</p:parameter-set>
use:
<p:parameter-set name="setc">
<p:use-parameter-set name="seta" />
<p:parameter name="aname" value="3" />
</p:parameter-set>
and rather than:
<p:xslt use-parameter-sets="seta setb">
...
<p:xslt>
use:
<p:xslt>
<p:use-parameter-set name="seta" />
<p:use-parameter-set name="setb" />
</p:xslt>
The reason is that elsewhere (namely in <p:input>) we use a nested
syntax for constructing sequences of documents, and this seems to be a
similar kind of thing. It also simplifies things when it comes to
figuring out whether parameters in the content or from the used
parameter sets get priority (see below).
> 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.
I don't much like '#top-level' as a name (sorry). What about
'#pipeline-parameters'?
> 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.
In the nested syntax that I suggested above, you could manage this by
altering the order in which the nested <p:parameter> or
<p:use-parameter-set> elements were specified. For example, to get the
same effect as above you could do:
<p:parameter-set name="setc">
<p:parameter name="aname" value="3" />
<p:use-parameter-set name="seta" />
</p:parameter-set>
and:
<p:parameter-set name="setd">
<p:use-parameter-set name="seta" />
<p:parameter name="aname" value="3" />
</p:parameter-set>
> 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.
I'm OK with this given that <p:parameters> always creates <c:parameter>
elements with NCNames in the name attribute.
The other thing from my proposal that I'd like to see here is to allow
extension attributes on the <c:parameter> elements, which are simply
ignored when a new parameter set is created. It just means that I can
use documents to hold my parameter sets and not have to worry about
stripping away any annotations I might place on them.
> 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?
[snip]
> 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>
That should be:
<p:catch>
<p:output port="result" />
<p:identity>
<p:input port="source"><p:empty /></p:input>
</p:identity>
</p:catch>
> <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>
Cheers,
Jeni
--
Jeni Tennison
http://www.jenitennison.com
Received on Wednesday, 6 June 2007 19:07:59 UTC