[xsl] RE: Re: Converting the flat XML to hierarchical format (plus grou ping, data replication and sorting)

Subject: [xsl] RE: Re: Converting the flat XML to hierarchical format (plus grou ping, data replication and sorting)
From: Shyam Chebrolu <schebrolu@xxxxxxxxxxxxxxx>
Date: Wed, 30 Jan 2002 14:01:13 -0500
I tried to post this before. It was bounced back for some reason... 

Anyway, I was able to comeup with some solution. But it is not complete.

I couldn't figure out how to sort the items after they are grouped...

I used the below XSL:

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

	<xsl:key name="products-by-group" match="GROUP_ID" use="." /> 
	<xsl:variable name="product-id" select="DATA/PRODUCT_ID" /> 
	<xsl:variable name="product-desc" select="DATA/PRODUCT_DESC"/> 
	<xsl:variable name="group-id" select="DATA/GROUP_ID"/> 

	<xsl:template match="/">
	<DATA>
		<xsl:for-each select="DATA/GROUP_ID[count(. |
key('products-by-group', .)[1]) = 1]">
		<PRODUCTS>
			<xsl:attribute name="ID"><xsl:value-of  select="."
/></xsl:attribute>
			<xsl:variable name="n" select="." />

			<xsl:for-each select="$group-id[. = $n or . = 0]">
				<xsl:variable name="index"
select="count(preceding-sibling::GROUP_ID) + 1" />
				<PRODUCT>
					<xsl:copy-of
select="$product-id[$index]" /> 
				  	<xsl:copy-of
select="$product-desc[$index]" /> 
				</PRODUCT>
			</xsl:for-each>
		</PRODUCTS>
		</xsl:for-each>
	</DATA>
	</xsl:template>
</xsl:stylesheet>



-----Original Message-----
From: Shyam Chebrolu 
Sent: 01/30/2002 8:55 AM
To: 'XSL-List@xxxxxxxxxxxxxxxxxxxxxx'
Subject: Re: Converting the flat XML to hierarchical format (plus grouping,
data replication and sorting)


I was hoping that I could accomplish the following using XSLT.. Any
direction would be really appreciated

-Thanks
Shyam

-----------------

I have a XML data file in the following format (flat):

<DATA>

<PRODUCT_ID>1</PRODUCT_ID>
<PRODUCT_DESC>Product 1</PRODUCT_DESC>
<GROUP_ID>0</GROUPD_ID>

<PRODUCT_ID>2</PRODUCT_ID>
<PRODUCT_DESC>Product 2</PRODUCT_DESC>
<GROUP_ID>0</GROUPD_ID>

<PRODUCT_ID>3</PRODUCT_ID>
<PRODUCT_DESC>Product 3</PRODUCT_DESC>
<GROUP_ID>0</GROUPD_ID>

<PRODUCT_ID>4</PRODUCT_ID>
<PRODUCT_DESC>Product 4</PRODUCT_DESC>
<GROUP_ID>1</GROUPD_ID>


<PRODUCT_ID>5</PRODUCT_ID>
<PRODUCT_DESC>Product 5</PRODUCT_DESC>
<GROUP_ID>1</GROUPD_ID>


<PRODUCT_ID>6</PRODUCT_ID>
<PRODUCT_DESC>Product 6</PRODUCT_DESC>
<GROUP_ID>2</GROUPD_ID>

</DATA>

I need to rearrange this data in hierarchical manner (there is more to
it...)

<DATA>
<PRODUCTS ID="0">

<PRODUCT>
    <PRODUCT_ID>1</PRODUCT_ID>
    <PRODUCT_DESC>Product 1</PRODUCT_DESC>
</PRODUCT>

<PRODUCT>
    <PRODUCT_ID>2</PRODUCT_ID>
    <PRODUCT_DESC>Product 2</PRODUCT_DESC>
</PRODUCT>

<PRODUCT>
    <PRODUCT_ID>3</PRODUCT_ID>
    <PRODUCT_DESC>Product 3</PRODUCT_DESC>
</PRODUCT>

</PRODUCTS>

<PRODUCTS ID="1">
...
...
</PRODUCTS>

...
...
</DATA>

I would like to keep a copy of all the PRODUCT nodes for Group "0" in every
other group ("1", "2" etc. Essentially, if someone asks for group "1", I
should be able to send GROUP 1 + GROUP 0 data together (and sorted) as one
set ) and each group sorted by PRODUCT_DESC.

The final output should be:

  
<DATA>
<PRODUCTS ID="0">
    <PRODUCT>
        <PRODUCT_ID>1</PRODUCT_ID>
        <PRODUCT_DESC>Product 1</PRODUCT_DESC>
    </PRODUCT>
    <PRODUCT>
        <PRODUCT_ID>2</PRODUCT_ID>
        <PRODUCT_DESC>Product 2</PRODUCT_DESC>
    </PRODUCT>
    <PRODUCT>
        <PRODUCT_ID>3</PRODUCT_ID>
        <PRODUCT_DESC>Product 3</PRODUCT_DESC>
    </PRODUCT>
</PRODUCTS>

<PRODUCTS ID="1">
    <PRODUCT>
        <PRODUCT_ID>1</PRODUCT_ID>
        <PRODUCT_DESC>Product 1</PRODUCT_DESC>
    </PRODUCT>
    <PRODUCT>
        <PRODUCT_ID>2</PRODUCT_ID>
        <PRODUCT_DESC>Product 2</PRODUCT_DESC>
    </PRODUCT>
    <PRODUCT>
        <PRODUCT_ID>3</PRODUCT_ID>
        <PRODUCT_DESC>Product 3</PRODUCT_DESC>
    </PRODUCT>
    <PRODUCT>
        <PRODUCT_ID>4</PRODUCT_ID>
        <PRODUCT_DESC>Product 4</PRODUCT_DESC>
    </PRODUCT>
    <PRODUCT>
        <PRODUCT_ID>5</PRODUCT_ID>
        <PRODUCT_DESC>Product 5</PRODUCT_DESC>
    </PRODUCT>
</PRODUCTS>

...
...
</DATA>

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread