[xsl] Make Hirachy from flat file

Subject: [xsl] Make Hirachy from flat file
From: "Thomas V. Nielsen" <verakso@xxxxxxxx>
Date: Mon, 13 Oct 2003 21:37:33 +0200
I have been readin some of the post about Adding Hirachy, it somehow theres
is somre resmblance to the problem I am trying to solve.

I have some XML data extracted from a ERP system into Excel and then saved
as Excel XML, it goes something like this.

<?xml version="1.0" encoding="utf-8"?>
<test>
	<row>
		<data>A</data>
		<data>1</data>
		<data>1234</data>
		<data>Description 1</data>
	</row>
	<row>
		<data>A</data>
		<data>1</data>
		<data>5678</data>
		<data>Description 2</data>
	</row>
	<row>
		<data>A</data>
		<data>2</data>
		<data>9012</data>
		<data>Description 3</data>
	</row>
	<row>
		<data>A</data>
		<data>2</data>
		<data>3456</data>
		<data>Description 4</data>
	</row>
	<row>
		<data>B</data>
		<data>1</data>
		<data>9012</data>
		<data>Description 3</data>
	</row>
	<row>
		<data>B</data>
		<data>2</data>
		<data>3456</data>
		<data>Description 4</data>
	</row>
</test>

So far I have only managed to get items grouped by the row/data[1] element,
but it is the "nested" gruoping by the row/data[2] element there is
bothering me.

Is there any hints how to get my XML look something like:

<test>
	<maingroup name="A">
		<prodgroup name="1">
			<rows>
				<itemno>1234</itemno>
				<description>Description 1</description>
			</rows>
			<rows>
				<itemno>5678</itemno>
				<description>Description 2</description>
			</rows>
		</prodgroup>
		<prodgroup name="2">
			<rows>
				<itemno>1234</itemno>
				<description>Description 3</description>
			</rows>
			<rows>
				<itemno>5678</itemno>
				<description>Description 4</description>
			</rows>
		</prodgroup>
	</maingroup>
	<maingroup name="B">
		<prodgroup name="1">
			<rows>
				<itemno>9012</itemno>
				<description>Description 5</description>
			</rows>
		</prodgroup>
		<prodgroup name="3">
			<rows>
				<itemno>3456</itemno>
				<description>Description 6</description>
			</rows>
		</prodgroup>
	</maingroup>
</test>

I only got this far:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes"/>
	<xsl:key name="groupkey" match="//test/row" use="data[1]"/>
	<xsl:template match="test">
		<test>
			<xsl:apply-templates select="row[generate-id(.) =
generate-id(key('groupkey', data)[1])]"/>
		</test>
	</xsl:template>
	<xsl:template match="row">
		<xsl:element name="maingroup">
			<xsl:attribute name="name"><xsl:value-of
select="data[1]"/></xsl:attribute>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>

Since I was hoping by using the generate-id, I could save a step and make
the loop on the prodroup name (row/data[2]), but for some strange reason to
me, I would have expected
	<row>
		<data>A</data>
		<data>1</data>
		<data>5678</data>
		<data>Description 2</data>
	</row>
To be different from
	<row>
		<data>B</data>
		<data>1</data>
		<data>9012</data>
		<data>Description 3</data>
	</row>
But I just can't seem to get i right.

</thomas>


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


Current Thread