- From: Geert Josten <geert.josten@dayon.nl>
- Date: Wed, 10 Jul 2013 15:37:17 +0200
- To: Jostein Austvik Jacobsen <josteinaj@gmail.com>, XProc Dev <xproc-dev@w3.org>
- Message-ID: <0a5e461d55002841426e588b3950616d@mail.gmail.com>
I am sure I mentioned the very same issue at least once on this list, might
already by somewhere on the vNext list. To me there is no functional logic
in having a sequence of parameter sets. You yourself just recently
mentioned that it can be awkward to not be able to use a sequence as input
for variables. So, that also applies to when you try to access parameters
when you are declaring a variable. I had this helper step that I added to
my own steps, just to facilitate this, and wrap param-sets to flatten the
sequence.
So, +1
*Van:* Jostein Austvik Jacobsen [mailto:josteinaj@gmail.com]
*Verzonden:* dinsdag 2 juli 2013 17:41
*Aan:* XProc Dev
*Onderwerp:* Parameter serialization
When you write an XProc step that has a parameter input port, the XProc
spec does not strictly say how the parameters are serialized on the input
port.
For instance, calabash outputs a sequence of c:param and c:param-set
elements, (basically just giving you whatever you put in, and appends a
c:param-set at the end containing all your p:with-param parameters).
calumet on the other hand gives you a sequence of c:param elements (no
c:param-set wrapping).
I don't know why the spec explicitly states that you can't have a
non-sequence parameter input port, but if it had been possible to declare a
non-sequence parameter input port, then all the parameters would have to be
combined into a c:param-set. I see no reason to have a sequence of
parameters really, since the serialization of the parameters are undefined
and you can't have multiple parameters with the same name (for some reason
- I'm guessing the XSLT use-case).
I would find it easier to work with parameters if they were all wrapped
into a single c:param-set. Alternatively I could live with a sequence of
c:params (like calumet does it); the important thing is that the format is
predictable so that I don't have to preprocess the parameters before
applying any of my own transformations to the set of parameters.
The following XProc script provides some parameters to a step and outputs
how they are serialized. Note also that this script fails if you remove the
sequence attribute from the p:output in the ex:identity step. If you
haven't specified sequence="true" on the parameter input port, then there
are no apparent reason for getting the
XD0006<http://www.w3.org/TR/xproc/#err.D0006>error unless you have
read the part of the spec that states that parameter
ports defaults to sequence="true".
<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="
http://www.w3.org/ns/xproc-step" xmlns:ex="http://example.net/ns"
version="1.0">
<p:output port="result" sequence="true"/>
<p:declare-step name="main" xmlns:p="http://www.w3.org/ns/xproc"
xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:ex="http://example.net/ns"
type="ex:identity" version="1.0">
<p:input port="source" primary="true" kind="parameter"
sequence="true"/>
<p:output port="result" sequence="true">
<p:pipe port="source" step="main"/>
</p:output>
<p:sink>
<p:input port="source">
<p:empty/>
</p:input>
</p:sink>
</p:declare-step>
<ex:identity>
<p:with-param name="with-param-before"
select="'with-param-before'"/>
<p:with-param name="param5" select="'value5-1'"/>
<p:input port="source">
<p:inline>
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">
<c:param name="param1" value="value1"/>
<c:param name="param3" value="value3-1"/>
</c:param-set>
</p:inline>
<p:inline>
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">
<c:param name="param2" value="value2"/>
<c:param name="param3" value="value3-2"/>
<c:param name="param4" value="value4-1"/>
<c:param name="param5" value="value5-2"/>
</c:param-set>
</p:inline>
<p:inline>
<c:param name="unwrapped-param"
value="unwrapped-param-value"/>
</p:inline>
</p:input>
<p:with-param name="with-param-after" select="'with-param-after'"/>
<p:with-param name="param4" select="'value4-2'"/>
</ex:identity>
</p:declare-step>
This is the result for calabash:
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">
<c:param name="param1" value="value1"/>
<c:param name="param3" value="value3-1"/>
</c:param-set>
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">
<c:param name="param2" value="value2"/>
<c:param name="param3" value="value3-2"/>
<c:param name="param4" value="value4-1"/>
<c:param name="param5" value="value5-2"/>
</c:param-set>
<c:param xmlns:c="http://www.w3.org/ns/xproc-step" name="unwrapped-param"
value="unwrapped-param-value"/>
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">
<c:param name="param5" namespace="" value="value5-1"/>
<c:param name="param4" namespace="" value="value4-2"/>
<c:param name="with-param-after" namespace="" value="with-param-after"/>
<c:param name="with-param-before" namespace=""
value="with-param-before"/>
</c:param-set>
This is the result for calumet:
<c:param name="with-param-before" namespace="" value="with-param-before"
xmlns:c="http://www.w3.org/ns/xproc-step"/>
<c:param name="param5" namespace="" value="value5-2" xmlns:c="
http://www.w3.org/ns/xproc-step"/>
<c:param name="param1" namespace="" value="value1" xmlns:c="
http://www.w3.org/ns/xproc-step"/>
<c:param name="param3" namespace="" value="value3-2" xmlns:c="
http://www.w3.org/ns/xproc-step"/>
<c:param name="param2" namespace="" value="value2" xmlns:c="
http://www.w3.org/ns/xproc-step"/>
<c:param name="param4" namespace="" value="value4-2" xmlns:c="
http://www.w3.org/ns/xproc-step"/>
<c:param name="unwrapped-param" namespace="" value="unwrapped-param-value"
xmlns:c="http://www.w3.org/ns/xproc-step"/>
<c:param name="with-param-after" namespace="" value="with-param-after"
xmlns:c="http://www.w3.org/ns/xproc-step"/>
I would've liked:
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">
<c:param name="with-param-before" value="with-param-before"/>
<c:param name="param5" value="value5-2"/>
<c:param name="param1" value="value1"/>
<c:param name="param3" value="value3-2"/>
<c:param name="param2" value="value2"/>
<c:param name="param4" value="value4-2"/>
<c:param name="unwrapped-param" value="unwrapped-param-value"/>
<c:param name="with-param-after" value="with-param-after"/>
</c:param-set>
What do you think?
Jostein
Received on Wednesday, 10 July 2013 13:37:59 UTC