Hi David
-----Original Message-----
From: David Frey [mailto:dpfrey(_at_)shaw(_dot_)ca]
Sent: Friday, 24 September 2010 11:51 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Question about grouping
I have an XSLT problem that I haven't been able to figure
out. The example below is essentially the simplest version
of the problem I have encountered.
Say you have a document like this:
<doc>
<book title="aaa" author="jones"/>
<book title="bbb" author="smith"/>
<book title="ccc" author="douglas"/>
<book title="ddd" author="jones"/>
<book title="eee" author="jones"/>
<book title="fff" author="douglas"/>
<book title="ggg" author="smith"/>
</doc>
How can you produce a document like this?:
<report>
<author name="jones">
<title>aaa</title>
<title>ddd</title>
<title>eee</title>
</author>
<author name="smith">
<title>bbb</title>
<title>ggg</title>
</author>
<author name="douglas">
<title>bbb</title>
<title>fff</title>
</author>
</report>
Restrictions:
- Only XSLT 1.0
- You can't hard-code the names of the books or the authors
in the XSLT.
This seems to work. Very quickly ripped off Jeni Tennison's example using the
Muenchian grouping method:
http://www.jenitennison.com/xslt/grouping/muenchian.html. Add sorting like she
did if you need it.
Throw this within your transform:
<xsl:key name="authorgroup" match="book" use="@author" />
<xsl:template match="/doc">
<report>
<xsl:for-each
select="book[count(.|key('authorgroup',@author)[1]) = 1]">
<author name="{(_at_)author}">
<xsl:for-each
select="key('authorgroup',@author)">
<title><xsl:value-of
select="@title" /></title>
</xsl:for-each>
</author>
</xsl:for-each>
</report>
</xsl:template>
Cheers
Hugh Barnes
Technical Interface Specialist
nehta - National E-Health Transition Authority
Address: Level 2, 10 Browning St, West End, QLD, 4101
Phone: +61 7 3023 8537
Mobile: +61 417 469 552
Email: hugh(_dot_)barnes(_at_)nehta(_dot_)gov(_dot_)au
Web: http://www.nehta.gov.au
--~------------------------------------------------------------------
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>
--~--