W3C home > Mailing lists > Public > xproc-dev@w3.org > September 2008

Re: compound steps and primary inputs

From: James Garriss <james@garriss.org>
Date: Wed, 24 Sep 2008 08:54:24 -0400
To: XProc Dev <xproc-dev@w3.org>
Message-ID: <C4FFB0C0.9F7%james@garriss.org>
I understand what a primary input port is.  What I don't know is how I know
that p:for-each has only one input.  If I look at a step like p:filter, it's
obvious from it's declaration (I'm catching on to the terms!) that it has
only one input port:

<p:declare-step type="p:filter">
     <p:input port="source"/>
     <p:output port="result" sequence="true"/>
     <p:option name="select" required="true"/>                     <!--
XPathExpression -->
</p:declare-step>

But p:for-each doesn't seem to have a declaration.  It looks sorta like
BNF/parser-token-stuff to me.  So what tells me that p:for-each has only one
input?

<p:for-each
  name? = NCName>
    ((p:iteration-source? &
      (p:output |
       p:log)*),
     subpipeline)
</p:for-each> 

James Garriss
http://garriss.blogspot.com




From: Norman Walsh <ndw@nwalsh.com>
Date: Tue, 23 Sep 2008 16:45:22 -0400
To: XProc Dev <xproc-dev@w3.org>
Subject: Re: compound steps and primary inputs
Resent-From: XProc Dev <xproc-dev@w3.org>
Resent-Date: Tue, 23 Sep 2008 20:46:27 +0000

James Garriss <james@garriss.org> writes:

> Do all compound steps have primary inputs?  I ask because I can't tell by
> reading the WD if p:for-each has a primary input or not.  I'm probably
> missing a key word somewhere.

The p:for-each step has only one input and the rules say

  [Definition: If a step has a document input port which is explicitly
  marked ³primary='true'², or if it has exactly one document input
  port and that port is not explicitly marked ³primary='false'², then
  that input port is the primary input port of the step.]

By the second clause, the input port of p:for-each is primary.

> When I use it in Calabash 0.6.1, it behaves as if it does:
>
> <p:declare-step xmlns:p="http://www.w3.org/ns/xproc">
>     <p:input port="source">
>         <p:document href="BookStore.xml"/>
>     </p:input>
>     <p:output port="result"/>
>     <p:filter select="/BookStore/Book[Date>'1970']"/>
>     <p:for-each>
>         <p:output port="result"/>
>         <p:identity/>
>     </p:for-each>
> </p:declare-step>
>
> The output of filter, a sequence of documents (<Book>...</Book>), is being
> inputted (is that a word?) into p:for-each.

That's right. And that's what you want, isn't it?

> Appreciate any insights!

1. You only need to use p:filter if some part of the expression you want
to test against is computed by the pipeline.

2. A p:for-each that contains only an identity step is a little, uh,
redundant.

I believe that you could simplify the pipeline above to just this:

<p:declare-step xmlns:p="http://www.w3.org/ns/xproc">
    <p:input port="source">
        <p:document href="BookStore.xml"/>
    </p:input>
    <p:output port="result"/>
    <p:identity select="/BookStore/Book[Date>'1970']"/>
</p:declare-step>

                                        Be seeing you,
                                          norm

-- 
Norman Walsh <ndw@nwalsh.com> | If we lived alone in a featureless
http://nwalsh.com/            | desert we should learn to place the
                              | individual grains of sand in a moral or
                              | aesthetic hierarchy.--Michael Frayn
Received on Wednesday, 24 September 2008 12:55:16 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Wednesday, 24 September 2008 12:55:17 GMT