Re: [xsl] Mapping from two sources (~ inner join in DB)

Subject: Re: [xsl] Mapping from two sources (~ inner join in DB)
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Sun, 03 Oct 2010 15:26:44 -0400
At 2010-10-03 11:56 -0700, sudheshna iyer wrote:
For the below question, I got the answers from you using <xsl:for-each-group>. But my version of XSLT is not supporting xsl:for-each-group.

Then it must be XSLT 1.0.


Is there a different way of implementing this?

Please find an XSLT 1.0 solution below that generates the output you specify.


I hope this helps.

. . . . . . . . Ken

p.s. Which order/order-response vocabularies are you using? Have you considered using the OASIS Universal Business Language (UBL) for such business documents?

   http://docs.oasis-open.org/ubl/os-UBL-2.0/UBL-2.0.html
   http://docs.oasis-open.org/ubl/UBL-2.0-update.html

~/t/ftemp $ cat input1.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<Order>
        <OrderLine>
                        <OLN>1</OLN>
                        <Fname>aa</Fname>
        </OrderLine>
        <OrderLine>
                        <OLN>2</OLN>
                        <Fname>bb</Fname>
        </OrderLine>
</Order>
~/t/ftemp $ cat input2.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<POOrder>
        <POOrderLine>
                        <OLN>1</OLN>
                        <ID>123</ID>
                        <LName>aa</LName>
        </POOrderLine>
        <POOrderLine>
                        <OLN>2</OLN>
                        <ID>324</ID>
                        <LName>bb</LName>
        </POOrderLine>
        <POOrderLine>
                        <OLN>3</OLN>
                        <ID>456</ID>
                        <LName>bb</LName>
        </POOrderLine>
</POOrder>
~/t/ftemp $ cat innerjoin.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="1.0">

<xsl:output indent="yes"/>

<xsl:key name="order-line-by-number" match="*[OLN]" use="OLN"/>

<xsl:template match="/">
  <xsl:variable name="input1" select="document('input1.xml')"/>
  <xsl:variable name="input2" select="document('input2.xml')"/>

  <OrderResponse>
    <!--walk each order line-->
    <xsl:for-each select="$input1/Order/OrderLine">
      <xsl:variable name="input1line" select="."/>
      <!--change context to the other file-->
      <xsl:for-each select="$input2">
        <!--act only on the lines of equal line number-->
        <xsl:for-each select="key('order-line-by-number',$input1line/OLN)">
          <!--join the information from both files-->
          <Oline>
            <xsl:copy-of select="OLN"/>
            <xsl:copy-of select="$input1line/Fname"/>
            <xsl:copy-of select="ID"/>
          </Oline>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:for-each>
  </OrderResponse>
</xsl:template>

</xsl:stylesheet>
~/t/ftemp $ xslt innerjoin.xsl innerjoin.xsl
<?xml version="1.0" encoding="utf-8"?>
<OrderResponse>
   <Oline>
      <OLN>1</OLN>
      <Fname>aa</Fname>
      <ID>123</ID>
   </Oline>
   <Oline>
      <OLN>2</OLN>
      <Fname>bb</Fname>
      <ID>324</ID>
   </Oline>
</OrderResponse>~/t/ftemp $


<?xml version="1.0" encoding="ISO-8859-1"?>
<OrderResponse>
        <Oline>
                <OLN>1</OLN>
                <Fname>aa</Fname>
                <ID>123</ID>
        </Oline>
        <Oline>
                <OLN>2</OLN>
                <Fname>bb</Fname>
                <ID>324</ID>
        </Oline>
</OrderResponse>


--
XSLT/XQuery training:   after http://XMLPrague.cz 2011-03-28/04-01
Vote for your XML training:   http://www.CraneSoftwrights.com/s/i/
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal

Current Thread