[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Mapping from two sources

Subject: Re: Mapping from two sources
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Sun, 03 Oct 2010 13:49:34 +0200
Re:  Mapping from two sources
sudheshna iyer wrote:
Thank you for your answers.

But the solution returns only elements from Doc1, I need element of Doc2 if
doc1.OLN = doc2.OLN
========
Problem

I need to have two sources:

input1 and input2.

input1:
<?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>


input2: <?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>

I need the output from both sources combined. Please note that first two elements are coming from input1 and thrid element is from input2. What is the optimal way of doing this?

<?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>
=====

Solution proposed:

<xsl:for-each-group select="$doc1//OrderLine, $doc2//POOrderline"
group-by="OLN">
<Oline>
<OLN><xsl:value-of select="current-grouping-key()"></OLN>
<xsl:copy-of select="current-group()/(FName, ID)"/>
</Oline>
</xsl:for-each-group>

It might simply be a problem of use the same spelling and case for element names in the input and the stylesheet (i.e. POOrderLine and not POOrderline) so try


<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:output method="xml" indent="yes"/>

<xsl:variable name="doc1" select="/"/>

  <xsl:param name="doc2Url" as="xs:string" select="'input2.xml'"/>
  <xsl:variable name="doc2" select="doc($doc2Url)"/>

  <xsl:template match="/">
    <OrderResponse>
      <xsl:for-each-group select="$doc1//OrderLine, $doc2//POOrderLine"
      group-by="OLN">
        <Oline>
          <OLN><xsl:value-of select="current-grouping-key()"/></OLN>
          <xsl:copy-of select="current-group()/(Fname, ID)"/>
        </Oline>
      </xsl:for-each-group>
    </OrderResponse>
  </xsl:template>

</xsl:stylesheet>

and then with your above samples you get

<OrderResponse>
   <Oline>
      <OLN>1</OLN>
      <Fname>aa</Fname>
      <ID>123</ID>
   </Oline>
   <Oline>
      <OLN>2</OLN>
      <Fname>bb</Fname>
      <ID>324</ID>
   </Oline>
   <Oline>
      <OLN>3</OLN>
      <ID>456</ID>
   </Oline>
</OrderResponse>

--

	Martin Honnen
	http://msmvps.com/blogs/martin_honnen/

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.