Setting Up the Transformation

The PeopleSoft SCM and PeopleSoft CRM purchase order messages share what are essentially the same first two elements: a purchase order number and the purchase order date. However, from there the structures differ. The PeopleSoft SCM message has a small section containing shipping information, followed by the list of items purchased. The PeopleSoft CRM message has the shipping information merged with the list of items purchased.

The following XSL transforms the PeopleSoft SCM purchase order message into the PeopleSoft CRM format:

<?xml version="1.0"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0">


  <xsl:template match="PURCHASEORDERMSG">
    <PO_MSG>
      <xsl:apply-templates select="FieldTypes"/>
      <xsl:apply-templates select="MsgData"/>
    </PO_MSG>
  </xsl:template>

  <xsl:template match="MsgData">
    <MsgData>
      <xsl:apply-templates select="Transaction"/>
    </MsgData>
  </xsl:template>

  <xsl:template match="Transaction">
    <Transaction>
      <xsl:apply-templates select="PURCHASEORDER"/>
      <PSCAMA class="R">
        <LANGUAGE_CD>ENG</LANGUAGE_CD>
        <AUDIT_ACTN/>
        <BASE_LANGUAGE_CD>ENG</BASE_LANGUAGE_CD>
        <MSG_SEQ_FLG/>
        <PROCESS_INSTANCE>0</PROCESS_INSTANCE>
        <PUBLISH_RULE_ID/>
        <MSGNODENAME/>
      </PSCAMA>
    </Transaction>
  </xsl:template>

  <xsl:template match="PURCHASEORDER">
    <PO_HEADER class="R">
      <PO_NUMBER IsChanged="Y"><xsl:value-of select="PURCHASEORDERNUM"/>
      </PO_NUMBER>
      <PO_DATE IsChanged="Y"><xsl:value-of select="PURCHASEORDERDATE"/>
      </PO_DATE>
      <xsl:apply-templates select="PURCHASEDITEMS"/>
    </PO_HEADER>
  </xsl:template>

  <xsl:template match="PURCHASEDITEMS">
    <PO_ITEM class="R">
      <SKU IsChanged="Y"><xsl:value-of select="ITEM"/></SKU>
      <CUSTNAME IsChanged="Y">
        <xsl:value-of select="../SHIPPINGDETAILS/NAME"/>
      </CUSTNAME>
      <SHIPPER IsChanged="Y">
         <psft_function name="codeset" codesetname="SCM_CODESET">
            <parm name="CARRIER_ID">
               <xsl:value-of select="../SHIPPINGDETAILS/CARRIER_ID"/>
            </parm>
            <value name="SHIPPER" select="."/>
         </psft_function>
 		</SHIPPER>
      <DESTADD IsChanged="Y">
        <xsl:value-of select="../SHIPPINGDETAILS/ADDRESS"/>
      </DESTADD>
      <DESTCITY IsChanged="Y">
        <xsl:value-of select="../SHIPPINGDETAILS/CITY"/>
      </DESTCITY>
      <DESTSTATE IsChanged="Y">
        <xsl:value-of select="../SHIPPINGDETAILS/STATE"/>
      </DESTSTATE>
    </PO_ITEM>
  </xsl:template>

  <xsl:template match="FieldTypes">
  <FieldTypes>
    <PO_HEADER class="R">
      <PO_NUMBER type="CHAR"/>
      <PO_DATE type="DATE"/>
    </PO_HEADER>
    <PO_ITEM class="R">
      <SKU type="CHAR"/>
      <CUSTNAME type="CHAR"/>
      <SHIPPER type="CHAR"/>
      <DESTADD type="CHAR"/>
      <DESTCITY type="CHAR"/>
      <DESTSTATE type="CHAR"/>
    </PO_ITEM>
    <PSCAMA class="R">
      <LANGUAGE_CD type="CHAR"/>
      <AUDIT_ACTN type="CHAR"/>
      <BASE_LANGUAGE_CD type="CHAR"/>
      <MSG_SEQ_FLG type="CHAR"/>
      <PROCESS_INSTANCE type="NUMBER"/>
      <PUBLISH_RULE_ID type="CHAR"/>
      <MSGNODENAME type="CHAR"/>
    </PSCAMA>
  </FieldTypes>
  </xsl:template>
</xsl:stylesheet>

Note that this XSL contains a reference to the psft_function, which will resolve codeset mapping after the transform has been run.

This XSL should be placed into an Application Engine program, and this program associated with the routing definitions for the service operation.