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
Sameer ShadabSubject: XSLT group
Author: Sameer Shadab
Date: 14 Jul 2005 11:02 AM
Hi

Can anyone help me out with grouping here.
My source is like this,

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Add>
<AQ>WE</AQ>
<Partner>121121</Partner>
</Add>
<Add>
<AQ>WE</AQ>
<Partner>121100</Partner>
</Add>
<Add>
<AQ>WE</AQ>
<Partner>121121</Partner>
</Add>
<Add>
<AQ>SP</AQ>
<Partner>1000001</Partner>
</Add>
<Add>
<AQ>SP</AQ>
<Partner>1000001</Partner>
</Add>
<Add>
<AQ>SP</AQ>
<Partner>1000002</Partner>
</Add>
</Root>

My target should be,

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Add>
<AQ>WE</AQ>
<Partner>121121</Partner>
</Add>
<Add>
<AQ>WE</AQ>
<Partner>121100</Partner>
</Add>
<Add>
<AQ>SP</AQ>
<Partner>1000001</Partner>
</Add>
<Add>
<AQ>SP</AQ>
<Partner>1000002</Partner>
</Add>
</Root>

It should group by similar AQ, and then same Partner.

thanks
Sam

Postnext
Ivan PedruzziSubject: XSLT group
Author: Ivan Pedruzzi
Date: 14 Jul 2005 11:56 AM
Hi Sameer,

Combine AQ with Partner to build a key.

Hope this helps
Ivan Pedruzzi
Stylus Studio Team

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

<xsl:key name="AQ" match="Root/Add/AQ" use="concat(., ../Partner)"/>

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

<xsl:template match="*|@*|text()">
<xsl:copy>
<xsl:apply-templates select="*|@*|text()"/>
</xsl:copy>
</xsl:template>


<xsl:template match="Root">
<xsl:copy>
<xsl:for-each select="Add/AQ[ generate-id() = generate-id(key('AQ', concat(., ../Partner))[1]) ]">
<xsl:apply-templates select=".."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

Postnext
Sameer ShadabSubject: XSLT group
Author: Sameer Shadab
Date: 15 Jul 2005 05:20 AM
Hi

Actually in the source xml there is a possibility, that it can contain other AQ values as well,
like the example below,
<?xml version='1.0' ?>
<Root><Add>
<AQ>WE</AQ>
<Partner>121100</Partner>
</Add><Add>
<AQ>WE</AQ>
<Partner>121121</Partner>
</Add><Add>
<AQ>SP</AQ>
<Partner>1000001</Partner>
</Add><Add>
<AQ>SP</AQ>
<Partner>1000002</Partner>
</Add><Add>
<AQ>XX</AQ>
<Partner>1000011</Partner>
</Add><Add>
<AQ>XX</AQ>
<Partner>1000012</Partner>
</Add></Root>

But i want only a grouping on WE and SP, and then on their respective partners, so the output should look like,

<?xml version='1.0' ?>
<Root><Add>
<AQ>WE</AQ>
<Partner>121100</Partner>
</Add><Add>
<AQ>WE</AQ>
<Partner>121121</Partner>
</Add><Add>
<AQ>SP</AQ>
<Partner>1000001</Partner>
</Add><Add>
<AQ>SP</AQ>
<Partner>1000002</Partner>
</Add></Root>

Sorry for missing out the extra condition earlier.

regards
Sameer

Postnext
Ivan PedruzziSubject: XSLT group
Author: Ivan Pedruzzi
Date: 15 Jul 2005 02:06 PM

Change the key definition

<xsl:key name="AQ" match="Root/Add/AQ[. = 'WE' or . = 'SP']" use="concat(., ../Partner)"/>


Ivan Pedruzzi
Stylus Studio Team

Postnext
Sameer ShadabSubject: XSLT group
Author: Sameer Shadab
Date: 16 Jul 2005 12:25 PM
Thanks Ivan, that did the trick.
Ivan sorry to trouble you once again, i have a question on how do i get a text output.
For instance if my source xml is,
<?xml version="1.0"?>
<Head>
<AA>
<SegmentAA>*AA</SegmentAA>
<Version>0200</Version>
</AA>
<BA>
<SegmentBA>*BA</SegmentBA>
<Shipment>560020</Shipment>
<PA>
<SegmentPA>*PA</SegmentPA>
<Track>12345</Track>
</PA>
<PA>
<SegmentPA>*PA</SegmentPA>
<Track>12346</Track>
</PA>
<SA>
<SegmentSA>*SA</SegmentSA>
<Count>4</Count>
</SA>
</BA>
<BA>
<SegmentBA>*BA</SegmentBA>
<Shipment>560021</Shipment>
<PA>
<SegmentPA>*PA</SegmentPA>
<Track>12355</Track>
</PA>
<PA>
<SegmentPA>*PA</SegmentPA>
<Track>12356</Track>
</PA>
<SA>
<SegmentSA>*SA</SegmentSA>
<Count>4</Count>
</SA>
</BA>
</Head>

My output should be
*AA0200*BA560020*PA12345*PA12346*SA4*BA560021*PA12355*PA12356*SA4

The Count field should be dynamic, i.e it should have a count of number of BA segment, PA Segment and SA segment. In the above instance, there are 1 BA segment, 2 PA segment and 1 SA hence the count is 4 on both occasions.

thanks
Sam

Posttop
Sameer ShadabSubject: XSLT group
Author: Sameer Shadab
Date: 25 Jul 2005 10:16 AM
Hi

I figured out how to get the dynamic count for *SA. But i still am unable to get my output in the following format.
*AA0200*BA560020*PA12345*PA12346*SA4*BA560021*PA12355*PA12356*SA4

Need some help in this front. The source xml is in my earlier post.

regards
Sameer

 
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.