- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Wed, 04 Oct 2006 21:06:12 +0100
- To: public-xml-processing-model-wg@w3.org
Hi Alex,
Alex Milowski wrote:
> But... since you can easy set parameter values on the pipeline and have
> those cascade into the XSLT step, you can easily pass configuration
> *string* parameters into your XSLT transform.
As long as they have the same name, yes. But what if you don't want the
names of the parameters in your stylesheet to be the same as the names
of the parameters of your pipeline?
Perhaps I'm approaching these the wrong way, but here are two real-world
examples where parameter values are calculated. In fact, these
parameters aren't XSLT parameters, but I don't think that matters.
First, accessing documents whose URIs are kept in a manifest.
<p:pipeline>
<p:declare-input port="manifest" />
<p:declare-output port="results" sequence="yes"
step="load-documents" source="result" />
<p:for-each name="load-documents">
<p:declare-input port="file-ref"
source="manifest"
select="/files/file" />
<p:declare-output port="result"
step="load-document" source="result" />
<p:step name="load-document" type="p:load">
<p:param name="href"
source="file-ref"
select="@href" />
</p:step>
</p:for-each>
</p:pipeline>
Second, documenting XSLT. I want to have a pipeline that creates HTML
documentation from a given stylesheet. If the URI for the HTML
documentation isn't specified by the person running the pipeline, then I
want it to default to the name of the stylesheet with a '.html' extension.
I can think of two ways of doing this: passing in the URI of the
stylesheet as a parameter to the pipeline, and parsing that URI to
create the URI for the HTML documentation:
<p:pipeline>
<p:declare-param name="stylesheet-uri" />
<p:declare-param name="documentation-uri"
select="substring($stylesheet-uri, 1,
string-length($stylesheet-uri) - 4)" />
<p:step name="load-stylesheet" type="p:load">
<p:param name="href" select="$stylesheet-uri" />
</p:step>
...
<p:step name="save-documentation" type="p:save">
<p:input name="documents" ... />
<p:param name="href" select="$documentation-uri" />
</p:step>
</p:pipeline>
or using base-uri() to get it. Assuming that we're not supporting XPath
2.0, I need a separate component to do that:
<p:pipeline>
<p:declare-input port="stylesheet" />
<p:declare-param name="documentation-uri" value="" />
...
<p:choose>
<p:when test="$documentation-href = ''">
<p:step name="get-base-uri" type="p:xpath2.0">
<p:input port="context" source="stylesheet" />
<p:param name="xpath"
value="replace(base-uri(.), '\.xsl$', '.html')" />
</p:step>
<p:step name="save-documentation" type="p:save">
<p:param name="href"
step="get-base-uri" source="result"
select="/xpath:result" />
</p:step>
</p:when>
...
</p:choose>
</p:pipeline>
> You will *not* be able to pass elements as parameters to the
> transformation and so would need generate an input transformation to do
> that. Once you have an input that is your configuration of a
> transformation, the next likely step is to pass XML structures. That
> means that 'step/source/select' on [p:]param will fail to be
> useful there and you'll be required to generate a transformation
> on the fly that imports your regular XSLT.
Yes. Most XSLT processors don't give you an easy way of passing in
anything but strings for parameters (from the command line), so I'm used
to designing transformations where instead of passing in the XML
configuration itself, I pass in the URI for its file.
Translated into XProc, this leads to problems with step ordering. If I do:
<p:step name="save-config" type="p:save">
<p:input port="document" ... />
<p:param name="href" select="$config-uri" />
</p:step>
<p:step name="transform" type="p:xslt">
<p:input port="source" ... />
<p:input port="stylesheet" ... />
<p:param name="doc-template-uri" select="$config-uri" />
</p:step>
but don't have a way (such as the order of the steps) of indicating that
actually the 'transform' step is dependent on 'save-config' then my
final result will be implementation-dependent.
As you say, an alternative design is to generate a stylesheet that sets
the parameter. Wanting to avoid extensions, with XSLT 1.0 you'd have to
copy the configuration XML into the generated stylesheet and use
document('') to get it.
I'm waiting for a better way.
Cheers,
Jeni
--
Jeni Tennison
http://www.jenitennison.com
Received on Wednesday, 4 October 2006 20:06:37 UTC