XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Samz SammySubject: How do I do something similar to an Outer Join using XSLT 1.0
Author: Samz Sammy
Date: 23 Jul 2007 10:22 AM
Originally Posted: 23 Jul 2007 10:20 AM
Hi friends

I have a requirement wherein I have to merge 2 nodes, lets say <ABC> and <XYZ>. Both have common elements/fields called AMOUNT, DATE, INVOICEID and CUSTOMERID.
My where clause would be something like this,

ABC."DATE"=XYZ."DATE" and
ABC.CUSTOMERID=XYZ.CUSTOMERID and
ABC.INVOICEID=XYZ.INVOICEID

But it should be like an outer join on XYZ, i.e if there is no value in the ABC then the value from XYZ should be picked, else the normal where condition should take place.

The final merged XML will have values from XYZ.

thanks and regards
Sammy

Postnext
James DurningSubject: How do I do something similar to an Outer Join using XSLT 1.0
Author: James Durning
Date: 23 Jul 2007 11:53 AM
Left outer join?
<xsl:for-each select="ABC">
<xsl:for-each select="XYZ[DATE=current()/DATE][CUSTOMERID=current()/CUSTOMERID][INVOICEID=current()/INVOICEID]">
output ABC Values,
output XYZ Values.
</xsl:for-each>
<xsl:if test="not(XYZ[DATE=current()/DATE][CUSTOMERID=current()/CUSTOMERID][INVOICEID=current()/INVOICEID])">
output ABC Values,
output null for XYZ values.
</xsl:if>
</xsl:for-each>

FULL OUTER JOIN? Copy above and:
<xsl:for-each select="XYZ[not (ABC[DATE=current()/DATE][CUSTOMERID=current()/CUSTOMERID][INVOICEID=current()/INVOICEID])]">
output null for ABC values,
output XYZ Values
</xsl:for-each>

Posttop
Samz SammySubject: How do I do something similar to an Outer Join using XSLT 1.0
Author: Samz Sammy
Date: 24 Jul 2007 11:01 AM
Originally Posted: 24 Jul 2007 10:34 AM
Thanks James

But ABC and XYZ nodes can occur multiple times. So how do we handle it in that scenario.

I am attaching the input xml.
In this input, I have to merge the MakeRows and ZZBCM_RULE node, the common element to do a left outer join on MakeRows is LINETYPE, and my WHERE clause would be something like,

(MakeRows.LINETYPE = ZZBCM_RULE.LINE_TYPE AND MakeRows.AMOUNT != '0.00') OR (MakeRows.AMOUNT_TALLIED != '0.00' AND MakeRows.AMOUNT = '0.00')

In the output I need the following fields,

LINETYPE --> MakeRows.LINETYPE
AMOUNT --> MakeRows.AMOUNT
ZFREE5 --> ZZBCM_RULE.ZFREE5
ZCOSCT --> ZZBCM_RULE.ZCOSTCT

Sorry about the size of the input.

regards
Sammy


DocumentInput(8).xml
Input File for the requirement

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.