Re: Some hints on the basics

Hello Wendell,

ok, taking your process description, as follows (to make sure I got it right)

' input1.xml -> A -> B -> C -> result1C.xml
input2.xml -> A -> B -> C -> result2C.xml
result1C.xml + result2C.xml -> aggregate.xml
aggregate.xml -> D -> resultD.xml
where A through D are all transformations.'

I have tried to emulate such a process, but probably oversimplified
your requirements.


<?xml version="1.0" encoding="UTF-8"?>

<p:pipeline name="w1" xmlns:p="http://www.w3.org/ns/xproc" version="1.0">
<p:input port="input1">
  <p:inline>
    <inputa>source data from input1</inputa>
  </p:inline>
</p:input>
<p:input port="input2">
  <p:inline>
    <inputb>source data from input2</inputb>
  </p:inline>
</p:input>

  <p:xslt name="step1">
    <p:input port="source">
      <p:pipe port="input1" step="w1"></p:pipe>
    </p:input>

    <p:input port="stylesheet">
      <p:inline>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="1.0">
          <xsl:template match="/">
            <testa>This is the result or xslt processing from step1
              <xsl:copy-of select="."/>
            </testa>
          </xsl:template>
        </xsl:stylesheet>
      </p:inline>
    </p:input>
  </p:xslt>

  <p:xslt name="step2">
    <p:input port="source">
      <p:pipe port="input2" step="w1"></p:pipe>
    </p:input>

    <p:input port="stylesheet">
      <p:inline>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="1.0">
          <xsl:template match="/">
            <testb>This is the result of xslt processing from step2
              <xsl:copy-of select="."/>
            </testb>
          </xsl:template>

        </xsl:stylesheet>
      </p:inline>
    </p:input>
  </p:xslt>

  <p:pack>
    <p:input port="source">
      <p:pipe port="result" step="step1"></p:pipe>
    </p:input>
    <p:input port="alternate">
      <p:pipe port="result" step="step2"></p:pipe>
    </p:input>
    <p:with-option name="wrapper" select="'wrapper'"/>
  </p:pack>

  <p:xslt name="step4">
    <p:input port="stylesheet">
      <p:inline>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="1.0">
          <xsl:template match="/">
             <transformd><xsl:copy-of select="."/></transformd>
          </xsl:template>
        </xsl:stylesheet>
      </p:inline>
    </p:input>
  </p:xslt>

</p:pipeline>

</p:pipeline>

This xproc has 4 distinct steps.

step1: uses input1 and transforms with inline stylesheet

step2: uses input2 and transforms with inline stylesheet

step3: aggregates the results of step1 and step2 ... notice how we
need to use p:pipe elements to address a certain steps output port

step4: applies transform to the output of step3, which is naturally
piped through

A few things to keep in mind:

* you can use p:document to define some external document wherever I
have used p:inline definition ... also if you are using oxygen you can
setup which documents come into the xproc by defining the input ports
defined in the transformation scenario

* XProc is designed to facilitate the simplest straight through
processing pipeline e.g. when steps omit p:input and p:output xml
flows between steps automatically ... once you stray from this default
scenario you will need to start using p:pipe to prescriptively
describe what data to use for input.

* you can easily encapsulate each step into a separate defined
p:declare-step and bring these in by p:import ... I would do this kind
of optimization as a last step

* note that parameters are useful when used with p:xslt

The result you should get is the following:

<transformd>
   <wrapper>
      <testa>This is the result or xslt processing from step1
           <inputa>source data from input1</inputa>
      </testa>
      <testb>This is the result of xslt processing from step2
           <inputb>source data from input2</inputb>
      </testb>
   </wrapper>
</transformd>

hth as a starting point,

James Fuller

Received on Wednesday, 14 April 2010 18:18:28 UTC