Re: [xsl] Creating unique groups

Subject: Re: [xsl] Creating unique groups
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Mon, 6 Dec 2004 20:39:59 -0800 (PST)
It is also worth exploring the XSLT 2.0 grouping
features. Following is the XSLT 2.0 answer (which
eliminates duplicates as well).  

<?xml version="1.0"?> 
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="2.0">
 
<xsl:output method="xml" indent="yes" /> 

<xsl:template match="/root">
  <root>
    <xsl:for-each-group select="group"
group-by="@name">
      <group name="{@name}">
        <xsl:variable name="curr-group"
as="element(entry)*">
          <xsl:copy-of select="current-group()/*" />
        </xsl:variable>
        <xsl:for-each
select="distinct-values($curr-group/@name)">
          <entry name="{.}" />
        </xsl:for-each>
      </group>  
     </xsl:for-each-group>
  </root> 
</xsl:template>
   
</xsl:stylesheet>

The stylesheet is tested with Saxon 8.1..

Regards,
Mukul

--- Dave Roe <david_roe@xxxxxxx> wrote:

> Fantastic - that certainly does the trick, thank
> you.
> 
> Is there a way of extending this approach so that it
> can de-duplicate 
> entries?
> 
> For example, if I have:
> 
> <root>
> 
> 	<group name="group1">
> 		<entry name="entry1" />
> 		<entry name="entry2" />
> 	</group>
> 
> 	<group name="group1">
> 		<entry name="entry2" />
> 		<entry name="entry3" />
> 	</group>
> 
> </root>
> 
> and I want to end up with:
> 
> <root>
> 
> 	<group name="group1">
> 		<entry name="entry1" />
> 		<entry name="entry2" />
> 		<entry name="entry3" />
> 	</group>
> 
> </root>
> 
> (with producing 2 entries for entry2).
> 
> Thanks again,
> /dave
> 
> On Dec 3, 2004, at 11:29 PM, Mukul Gandhi wrote:
> 
> > Hi Dave,
> >   Please try this XSL. It uses the Muenchian
> > technique.
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <xsl:stylesheet
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> > version="1.0">
> >
> > <xsl:key name="by-group-name" match="group"
> > use="@name" />
> >
> > <xsl:template match="/root">
> >   <root>
> >     <xsl:for-each select="group[generate-id(.) =
> > generate-id(key('by-group-name', @name)[1])]">
> >       <group name="{@name}">
> >         <xsl:for-each select="key('by-group-name',
> > @name)">
> >           <xsl:copy-of select="*"/>
> >         </xsl:for-each>
> >       </group>
> >     </xsl:for-each>
> >   </root>
> > </xsl:template>
> >
> > </xsl:stylesheet>
> >
> > Regards,
> > Mukul



		
__________________________________ 
Do you Yahoo!? 
All your favorites on one personal page  Try My Yahoo!
http://my.yahoo.com 

Current Thread