INPUT
<pop>
<feature><f>featureid1</f><p>pubid1</p></feature>
<feature><f>featureid1</f><p>pubid2</p></feature>
<feature><f>featureid2</f><p>pubid1</p></feature>
<feature><f>featureid3</f><p>pubid1</p></feature>
<feature><f>featureid3</f><p>pubid2</p></feature>
</pop>
STYLESHEET
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="pop">
<xsl:variable name="v">
<xsl:for-each-group select="feature" group-by="f">
<feature>
<f><xsl:value-of select="current-grouping-key()" /></f>
<p>
<xsl:value-of separator=", ">
<xsl:perform-sort select="current-group()/p">
<xsl:sort select="."/>
</xsl:perform-sort>
</xsl:value-of>
</p>
</feature>
</xsl:for-each-group>
</xsl:variable>
<xsl:for-each-group select="$v/feature" group-by="p">
<feature>
<f><xsl:value-of select="current-group()/f" separator=", "/></f>
<p><xsl:value-of select="current-grouping-key()" /></p>
</feature>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
OUTPUT
<?xml version="1.0" encoding="UTF-8"?>
<feature>
<f>featureid1, featureid3</f>
<p>pubid1, pubid2</p>
</feature>
<feature>
<f>featureid2</f>
<p>pubid1</p>
</feature>
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: Josh Goodman [mailto:jogoodma(_at_)indiana(_dot_)edu]
Sent: 07 September 2006 16:04
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Complicated grouping question
Hi all,
I have a XSL grouping problem that I am having difficulty
with and for which I couldn't find a previous post about in
the archives. I also noticed that there hadn't been a
grouping question in a day or so I thought I would do my part
to help out :-).
I'm using XSLT 2.0 as implemented by Saxon 8.8 (congrats to
Michael on this latest version). The XML I'm working with
looks like this:
<feature>
<id>BACR48K23</id>
<pub>
<id>0105495</id>
</pub>
</feature>
...
This can sometimes be repeated over again with a new
feature/id and the same pub/id, a new pub/id and the same
feature/id, or both ids being completely new.
Each feature chunk is adjacent to the others but they are in
random order. A completely flat view of this would look like
this for example
featureid1 pubid1
featureid1 pubid2
featureid2 pubid1
featureid3 pubid1
featureid3 pubid2
The grouping I would like to do is first group by featureid
to produce this list.
featureid1 pubid1, pubid2
featureid2 pubid1
featureid3 pubid1, pubid2
This is no problem using something along the lines of
<xsl:for-each-group select="feature" group-by="id">
<xsl:value-of select="current-grouping-key()" />
<xsl:value-of select="current-group()/pub/id"
separator=", " /> </xsl:for-each-group>
The problem comes in to play because I need to do another
round of grouping.
This time on items from the second list grouped by those with
a common set of pubid's. Doing this on the above list would
produce this:
featureid1, featureid3 pubid1, pubid2
featureid2 pubid1
I've not been able to wrap my head around the best way to
achieve this. Anyone have suggestions?
Thanks,
Josh Goodman
--~------------------------------------------------------------------
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>
--~--