- From: Norman Walsh <ndw@nwalsh.com>
- Date: Fri, 19 Sep 2008 09:17:07 -0400
- To: James Garriss <james@garriss.org>
- Cc: <xproc-dev@w3.org>
- Message-ID: <m28wtos2b0.fsf@nwalsh.com>
James Garriss <james@garriss.org> writes:
> using: Calabash 0.6.0
>
> When I use a pipeline with a p:compare step, Calabash gives this error:
> Input |result unbound on pipeline step named main and no default binding
> available.
>
> I can make the error go away by inserting this:
>
> <p:input port="|result"/>
Hmm. The fact that Calabash doesn't reject that is a bug.
> But when I look at the spec
> (http://www.w3.org/TR/2008/WD-xproc-20080814/#c.compare), I don¹t see this
> port mentioned.
>
> What am I missing?
The input ports named "|name" (and output ports named "name|") are an
internal detail in Calabash, they aren't supposed to show up in your
pipeline.
> PS Here¹s my pipeline:
So I'm guessing it looked like this before you added the |result
binding:
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" name="main">
<p:input port="source" primary="true">
<p:document href="Bookstore.xml"/>
</p:input>
<p:input port="alternate">
<p:document href="BookStoreDupe.xml"/>
</p:input>
<p:output port="result"/>
<p:compare fail-if-not-equal="true">
<p:input port="source">
<p:pipe step="main" port="source"/>
</p:input>
<p:input port="alternate">
<p:pipe step="main" port="alternate"/>
</p:input>
</p:compare>
</p:declare-step>
The problem here is that the output port of p:compare is not primary. So
it doesn't automaticaly get bound to the main pipeline's "result" port.
This will work:
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" name="main">
<p:input port="source" primary="true">
<p:document href="Bookstore.xml"/>
</p:input>
<p:input port="alternate">
<p:document href="BookStoreDupe.xml"/>
</p:input>
<!-- VVV -->
<p:output port="result">
<p:pipe step="compare" port="result"/>
<p:output>
<!-- ^^^ -->
<p:compare name="compare" fail-if-not-equal="true">
<p:input port="source">
<p:pipe step="main" port="source"/>
</p:input>
<p:input port="alternate">
<p:pipe step="main" port="alternate"/>
</p:input>
</p:compare>
</p:declare-step>
Now you're probably thinking, what the heck is wrong with these people?
Well, the thing is, the output from compare is a c:result, not the identity
transform. So your pipeline as defined above will produce
<c:result>true</c:result>
or it will fail. That's probably not what you had in mind. You
probably wanted something like this:
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" name="main">
<p:input port="source" primary="true">
<p:document href="Bookstore.xml"/>
</p:input>
<p:input port="alternate">
<p:document href="BookStoreDupe.xml"/>
</p:input>
<p:output port="result">
<p:compare name="compare" fail-if-not-equal="true">
<p:input port="source">
<p:pipe step="main" port="source"/>
</p:input>
<p:input port="alternate">
<p:pipe step="main" port="alternate"/>
</p:input>
</p:compare>
<p:choose>
<p:when test=". = 'true'">
<p:xpath-context>
<p:pipe step="compare" port="result" />
</p:xpath-context>
<p:identity>
<p:input port="source">
<p:pipe step="main" port="source" />
</p:input>
</p:identity>
</p:when>
<p:otherwise>
<!-- it doesn't really matter what you put here, since compare will
fail if it isn't true. -->
<p:identity>
<p:input port="source">
<p:pipe step="comparison" port="result" />
</p:input>
</p:identity>
</p:otherwise>
</p:choose>
</p:declare-step>
This step acts like the identity step on one of its inputs, if and only if
the two inputs are the same.
I admit it's less than elegant.
Be seeing you,
norm
--
Norman Walsh <ndw@nwalsh.com> | Talk as if you were making your will:
http://nwalsh.com/ | the fewer the words the less the
| litigation.-- Gracián
Received on Friday, 19 September 2008 13:17:48 UTC