This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Re: Converting the flat XML to hierarchical format (plus grouping, data replication and sorting)
- From: Shyam Chebrolu <schebrolu at webtonetech dot com>
- To: "'XSL-List at lists dot mulberrytech dot com'" <XSL-List at lists dot mulberrytech dot com>
- Date: Wed, 30 Jan 2002 14:01:13 -0500
- Subject: [xsl] RE: Re: Converting the flat XML to hierarchical format (plus grouping, data replication and sorting)
- Reply-to: xsl-list at lists dot mulberrytech dot com
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@lists.mulberrytech.com'
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