The p:variable creates a variable called "input-file". The value of the variable is established by applying the xpath specified with the "select" attribute to the contents of a document supplied in the body of the p:variable element. If you look at the spec, you will see that this document can be supplied in a variety of ways (it can, for example be supplied directly in-line by using the p:document element. In this case, however, p:pipe is used to pipe in the content of the document supplied on the "par" port of the pipe-abc pipe. Assuming that this document is a valid c:param-set element like this:

---------------------------------
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">

  <!-- run this pipeline... -->
  <c:param name="pipeline" value="xyz"/>

  <!-- with these parameters... -->
  <c:param name="input-file" value="file:///some/input/file.ext"/>
  <c:param name="output-file" value="file:///some/output/file.ext"/>
  <c:param name="abc" value="def"/>

</c:param-set>
---------------------------------

then "input-file" will be assigned the value referenced by the select statement (file:///some/input/file.ext
in this case).

Hope this helps.

Kevin Flynn
Alex Muir wrote:
Hi Kevin,

I'm just getting a chance now to get your example running. It has helped me out a tonne and I'm sure it will help others down the road.

One thing that I don't understand is why <p:pipe step="pipe-abc" port="par"/> needs to be inside the p:variable. What function does it have in there?


        <p:variable name="input-file" select="/c:param-set/c:param[@name='input-file']/@value">
            <p:pipe step="pipe-abc" port="par"/>
        </p:variable>

   <p:load name="load">
            <p:with-option name="href" select="$input-file"/>
        </p:load>


Thanks Much
Alex


On Fri, Nov 27, 2009 at 8:51 AM, Kevin Flynn <kevin@escenic.com> wrote:
I received the following request from alex.g.muir@gmail.com:


 I was looking over your posts at the following link regarding Xproc and using and xml file
 to drive the processing. I'm looking to do something similar I was wondering if you could
 share some solution on the xproc dev list to show how you ended up solving what you were doing.

 http://lists.w3.org/Archives/Public/xproc-dev/2009Jul/att-0013/00-part

So here goes:
=========================================================
It's still a work in (intermittent) progress, but what I currently do is use the http://www.w3.org/ns/xproc-step param-set element for making configuration files. For example:

---------------------
<c:param-set xmlns:c="http://www.w3.org/ns/xproc-step">

 <!-- run this pipeline... -->
 <c:param name="pipeline" value="xyz"/>

 <!-- with these parameters... -->
 <c:param name="input-file" value="file:///some/input/file.ext"/>
 <c:param name="output-file" value="file:///some/output/file.ext"/>
 <c:param name="abc" value="def"/>

</c:param-set>
-----------------------

A configuration file always contains one "master" parameter, "pipeline" that names the actual pipeline to be run. All the other parameters are the parameters required by that pipeline.

This parameter file is submitted as the only input to a master pipeline (called run-pipe.xpl) which just contains a big choose element that runs the specified pipeline and passes on all the specified parameters.

---------------------
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
              xmlns:c="http://www.w3.org/ns/xproc-step"
              xmlns:pipes="http://xmlns.escenic.com/2009/xproc/my-pipes"
              xmlns:lib="http://xmlns.escenic.com/2009/xproc/my-library"
              name="run-pipe">

    <p:input port="source"/>
    <p:input port="par" kind="parameter"/>

    <!-- output port not needed, but this will output the URL of the saved file -->
    <p:output port="result">
      <p:pipe step="end-of-pipe" port="result"/>
    </p:output>

 <p:import href="pipes.xpl"/>

 <p:variable name="pipeline" select="/c:param-set/c:param[@name='pipeline']/@value">
  <p:pipe step="run-pipe" port="par"/>
 </p:variable>

 <p:choose>
  <p:when test="$pipeline='abc'">
    <pipes:abc name="abc">
      <p:input port="par" kind="parameter">
        <p:pipe step="run-pipe" port="par"/>
      </p:input>
    </pipes:abc>
  </p:when>
  <!-- ...lots more "whens"... -->
 <p:otherwise>
    <p:identity>
      <p:input port="source">
        <p:inline>
          <ebd:message>Pipe not found</ebd:message>
        </p:inline>
      </p:input>
    </p:identity>
  </p:otherwise>
 </p:choose>

 <p:identity name="end-of-pipe"/>

</p:declare-step>
---------------------

pipes.xpl contains all the actual pipelines, each of which has the following basic structure:

---------------------
 <p:declare-step type="pipes:abc" name="pipe-abc">

      <p:input port="source"/>
      <p:input port="par" kind="parameter"/>
      <p:output port="result">
        <p:pipe step="store" port="result"/>
      </p:output>

  <p:import href="library.xpl"/>

  <p:variable name="input-file" select="/c:param-set/c:param[@name='input-file']/@value">
    <p:pipe step="pipe-abc" port="par"/>
  </p:variable>
  <p:variable name="output-file" select="/c:param-set/c:param[@name='output-file']/@value">
    <p:pipe step="pipe-abc" port="par"/>
  </p:variable>

  <p:load name="load">
    <p:with-option name="href" select="$input-file"/>
  </p:load>

  <lib:some-basic-pipe name="some-basic-pipe">
    <p:input port="par" kind="parameter">
      <p:pipe step="pipe-abc" port="par"/>
    </p:input>
  </lib:some-basic-pipe>

  <!-- ...more pipes from library.xpl... -->

  <p:store name="store">
    <p:with-option name="href" select="$output-file"/>
  </p:store>

 </p:declare-step>
---------------------

The pipelines in pipes.xpl extract the parameters they need to "load" input files and "store" output files, and otherwise just call a sequence of simpler pipelines from library.xpl.

The pipelines in library.xpl are mostly just sequences of xslt and other atomic steps:

---------------------
 <p:declare-step type="lib:some-basic-pipe" name="lib-some-basic-pipe">
      <p:input port="source"/>
      <p:input port="par" kind="parameter"/>
      <p:output port="result">
        <p:pipe step="trf2" port="result"/>
      </p:output>
    <p:xslt name="trf1">
    <p:input port="stylesheet">
        <p:document href="xsl/trf1.xsl"/>
    </p:input>
  </p:xslt>

  <p:xslt name="trf2">
    <p:input port="stylesheet">
      <p:document href="xsl/trf2.xsl"/>
    </p:input>
  </p:xslt>
 </p:declare-step>
---------------------

All the parameters specified in the configuration file are passed in to all the transformations, which can use the ones they need. trf1.xsl, for example, might contain:

---------------------
  <xsl:param name="abc"/>
---------------------

and would therefore use the setting 'def' specified in the configuration file.

This structure means you can build up a library.xpl containing basic pipes that can be re-used in various ways, and a higher-level pipes.xpl that slots them together in more complex ways and deals with reading and writing files. It's all accessible in a uniform way - one pipe to call them all, plus a configuration file. Since I'm using the standard http://www.w3.org/ns/xproc-step param-set element for the configuration file, you can alternatively specify parameters on the command line.

In order to make this framework really useable, two things are needed:

- strict naming conventions for parameters
- an automated means of exposing all the parameters used by a particular pipeline.

What I am thinking of doing is defining a standard way of documenting all parameters, wherever they appear - in XSLT transformations or pipes - most likely using a namespace. It would then be possible to make an XSLT transformation that, given the name of one of the top-level pipes in pipes.xpl, could drill down through all the called sub-pipes and transformations, find all the parameters used and generate a complete, fully-documented configuration file.

Any advice, suggestions, offers of help etc. are more than welcome.

If this list is an inappropriate forum for this kind of discussion (most posts seem to be focused on the specification, rather than applications), maybe somebody can suggest an alternative?

Regards,

Kevin Flynn




--

Alex
https://sites.google.com/a/utg.edu.gm/alex