- From: Kevin Flynn <kevin@escenic.com>
- Date: Fri, 27 Nov 2009 09:51:16 +0100
- To: "xproc-dev@w3.org" <xproc-dev@w3.org>
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
Received on Friday, 27 November 2009 08:51:52 UTC