W3C home > Mailing lists > Public > xproc-dev@w3.org > June 2009

Recommendation needed: how to provide a user-defined step (pipeline) with a subset of information

From: Costello, Roger L. <costello@mitre.org>
Date: Fri, 12 Jun 2009 19:54:31 -0400
To: "'xproc-dev@w3.org'" <xproc-dev@w3.org>
Message-ID: <9E51F88D5247B648908850C35A3BBB5003FE91A5D1@IMCMBX3.MITRE.ORG>

Hi Folks,

I seek your ideas on how best to implement the following.

I created a user-defined step (i.e. pipeline) to decide if a person applying for an auto loan is underage. The step needs two pieces of information: Age and State.

The Loan_Application.xml document contains that plus a lot of other information:

<Loan-Application>
    <Applicant>
        <Name>Johnny Brown</Name>
        <Age>17</Age>
        <Address>
            <Street>101 Curl Drive</Street>
            <City>Columbus</City>
            <State>OH</State>
        </Address>
    </Applicant>
    <Car>
        <Make>Mazda</Make>
        <Model>Miata</Model>
        <Year>2009</Year>
    </Car>
    <Loan-Amount>26000</Loan-Amount>
</Loan-Application>

I don't want to send all this to my user-defined step; I only want to send Age and State.

How do you suggest I implement my user-defined step? Currently I have implemented it with two input ports: Age and State:

    <p:declare-step type="applicant:is-underage"
                    name="is-underage">

        <p:input port="state" primary="true" />
        <p:input port="age" />
        <p:output port="result"/>

        ...
    </p:declare-step>

However, using it is cumbersome: first I need to filter the Loan_Application.xml document twice, once to extract Age and once to extract State:
    
    <p:filter name="get-state" select="Loan-Application/Applicant/Address/State" >
        <p:input port="source">
            <p:pipe step="Auto_Loan" port="auto-loan-application" />
        </p:input>
    </p:filter>

    <p:filter name="get-age" select="Loan-Application/Applicant/Age" >
        <p:input port="source">
            <p:pipe step="Auto_Loan" port="auto-loan-application" />
        </p:input>
    </p:filter>

Then I can use my user-defined step, connecting its input ports to the p:filter outputs:

    <applicant:is-underage>
        
        <p:input port="state">
            <p:pipe step="get-state" port="result" />
        </p:input>
        
        <p:input port="age">
            <p:pipe step="get-age" port="result" />
        </p:input>
        
    </applicant:is-underage>

There's got to be a better way. 

Perhaps my user-defined step should be implemented using options, rather than input ports? (I tried that but wasn't able to get it to work)

My question boils down to this: 

    What's the best way to extract a few pieces 
    of information from an XML document and 
    provide them to a user-defined step?


/Roger


P.S. Here's my user-defined step:

    <p:declare-step type="applicant:is-underage"
                    name="is-underage">

        <p:input port="state" primary="true" />
        <p:input port="age" />
        <p:output port="result"/>

        
        <p:pack wrapper="applicant">
            <p:input port="alternate">
                <p:pipe step="is-underage" port="age" />
            </p:input>
        </p:pack>
        
        <p:group>
            <p:variable name="state" select="applicant/*[1]" />
            <p:variable name="age" select="applicant/*[2]" />
            
            <p:choose>
                <p:when test="($state eq 'AK') and (number($age) le 16)">
                    <p:identity>
                        <p:input port="source">
                            <p:inline><c:result>true</c:result></p:inline>
                        </p:input>
                    </p:identity>
                </p:when>
                <p:when test="($state eq 'AL') and (number($age) le 18)">
                    <p:identity>
                        <p:input port="source">
                            <p:inline><c:result>true</c:result></p:inline>
                        </p:input>
                    </p:identity>
                </p:when>
                <p:when test="($state eq 'AZ') and (number($age) le 17)">
                    <p:identity>
                        <p:input port="source">
                            <p:inline><c:result>true</c:result></p:inline>
                        </p:input>
                    </p:identity>
                </p:when>
                <!-- ... -->
                <p:when test="($state eq 'OH') and (number($age) le 18)">
                    <p:identity>
                        <p:input port="source">
                            <p:inline><c:result>true</c:result></p:inline>
                        </p:input>
                    </p:identity>
                </p:when>
                <!-- ... -->
                <p:when test="($state eq 'WY') and (number($age) le 17)">
                    <p:identity>
                        <p:input port="source">
                            <p:inline><c:result>true</c:result></p:inline>
                        </p:input>
                    </p:identity>
                </p:when>
                <p:otherwise>
                    <p:identity>
                        <p:input port="source">
                            <p:inline><c:result>false</c:result></p:inline>
                        </p:input>
                    </p:identity>
                </p:otherwise>
            </p:choose>
        </p:group>

    </p:declare-step>
Received on Friday, 12 June 2009 23:55:03 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Friday, 12 June 2009 23:55:04 GMT