RE: RE: [xsl] flat structure to deep structure in a smart way

Subject: RE: RE: [xsl] flat structure to deep structure in a smart way
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 24 Sep 2004 22:01:35 +0100
Jeni's site also has some material on multi-level grouping.

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: jozef.aerts@xxxxxxxxxxxxxx [mailto:jozef.aerts@xxxxxxxxxxxxxx] 
> Sent: 24 September 2004 20:40
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: RE: [xsl] flat structure to deep structure in a smart way
> 
> 
> Dear Michael,
> 
> Many thanks for the link. The article is a real eye-opener.
> 
> So I started:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <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="A-key" match="line" use="item[@itemcount=1]"/>
> 	<xsl:key name="B-key" match="line" use="item[@itemcount=2]"/>
> 	<xsl:key name="C-key" match="line" use="item[@itemcount=3]"/>
> 	
> 	<xsl:template match="root">
> 	  <xsl:element name="result">
> 	    <xsl:for-each select="line[count(. | key('A-key',
> item[@itemcount=1])[1]) = 1]">
> 	      <xsl:element name="A">
> 	        <xsl:attribute name="Value"><xsl:value-of
> select="item[@itemcount=1]" /></xsl:attribute>
> 	        <xsl:for-each select="key('A-key', item[@itemcount=1])">
> 	            <!-- we need to group the B-elements 
> 	            How do we do that here ? -->
> 	            <xsl:element name="B">
> 	              <xsl:attribute name="Value"><xsl:value-of
> select="item[@itemcount=2]"/></xsl:attribute>
> 	            </xsl:element>
> 	          </xsl:for-each>
> 	      </xsl:element>
> 	     </xsl:for-each>
> 	   </xsl:element>
> 	</xsl:template>
> </xsl:stylesheet>
> 
> which brings me:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <result>
> 	<A Value="A1">
> 		<B Value="B1"/>
> 		<B Value="B22"/>
> 	</A>
> 	<A Value="A3">
> 		<B Value="B3"/>
> 		<B Value="B3"/>
> 		<B Value="B3"/>
> 	</A>
> </result>
> 
> Now I got a bit stuck. Under the A3 I need to group the B-elements
> again. How do I do that ?
> I presume I need to change/add something to the 
> <xsl:for-each select="key('A-key', item[@itemcount=1])"> line
> but it is not entirely clear how to do that.
> 
> P.S. Once this is solved I will post the full stylesheet as I 
> think this
> a very typical problem from a sorted database table.
> 
> Many thanks in advance
> 
> Jozef
> 
> 
> Michael Kay <mike@xxxxxxxxxxxx> schrieb am 24.09.2004, 19:22:44:
> > > In the element  you see an A1 again, so B22 
> > > should fall
> > > under A1 that's under line 1. I.e. if an element has the 
> same value as
> > > in the previous line, it should become a subelement of 
> the first line.
> > > 
> > > 
> > > What is the best strategy to accomplish this ?
> > > 
> > 
> > As mentioned several times in the last couple of days, read
> > 
> > http://www.jenitennison.com/xslt/grouping
> > 
> > Michael Kay
> > http://www.saxonica.com/

Current Thread