Thanks. Sorry about the tags.
I was inventing a similar structure to my actual one, but with completely
unrelated content when I got cut-and-paste happy. I thought the document I
presented would be easier for a general audience to grasp rather than the stuff
I'm really working with.
Andrew's model showed me the error of my ways. Yours appears to be the same in
the critical area.
Thanks again for taking the time.
--
Charles Knell
cknell(_at_)onebox(_dot_)com - email
-----Original Message-----
From: Bjorndahl, Brad <brad(_dot_)bjorndahl(_at_)thermofisher(_dot_)com>
Sent: Thu, 24 May 2007 12:12:51 -0400
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Subject: RE: [xsl] XSLT 2.0 multi-level grouping challenge/problem
I did something like this recently. I tested this with your xml (which
needed a little fixing).
<xsl:transform version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/donors">
<xsl:variable name="DONORS" >
<DONORS>
<xsl:for-each-group select="donor" group-by="state" >
<state name="{current-grouping-key()}" >
<xsl:for-each-group select="current-group()" group-by="city"
<city name="{current-grouping-key()}" >
<xsl:for-each-group select="current-group()"
group-by="organ">
<organ name="{current-grouping-key()}"><xsl:value-of
select="count(current-group())" /></organ>
</xsl:for-each-group>
</city>
</xsl:for-each-group>
</state>
</xsl:for-each-group>
</DONORS>
</xsl:variable>
<xsl:apply-templates select="$DONORS" />
</xsl:template>
<xsl:template match="DONORS" >
<table border="1">
<tr>
<th>State</th>
<th>City</th>
<th>Organ</th>
<th>count</th>
</tr>
<xsl:apply-templates />
</table>
</xsl:template>
<xsl:template match="state" >
<tr>
<td rowspan="{count(city/organ)}" ><xsl:value-of select="@name"
/></td>
<xsl:apply-templates />
</tr>
</xsl:template>
<xsl:template match="city" >
<xsl:choose>
<xsl:when test="position() eq 1" >
<td rowspan="{count(organ)}"><xsl:value-of select="@name"
/></td>
<xsl:apply-templates />
</xsl:when>
<xsl:otherwise>
<tr>
<td rowspan="{count(organ)}"><xsl:value-of select="@name"
/></td>
<xsl:apply-templates />
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="organ" >
<xsl:choose>
<xsl:when test="position() eq 1" >
<td><xsl:value-of select="@name" /></td>
<td><xsl:value-of select="." /></td>
</xsl:when>
<xsl:otherwise>
<tr>
<td><xsl:value-of select="@name" /></td>
<td><xsl:value-of select="." /></td>
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:transform>
Brad
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--