| Subject: [xsl] XSLT 1.0 Grouping From: aspsa <aspsa@xxxxxxxxxxxxx> Date: Tue, 12 Apr 2005 01:06:41 -0400 | 
Hi, folks...
I'm trying to wrap my brain around the Muenchian Method. Essentially, I have
the following simple XML document.
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <people>
  <person>
   <name>
    <fname>Jack</fname>
    <mname>Fred</mname>
    <lname>Smith</lname>
   </name>
   <age>22</age>
  </person>
  <person>
   <name>
    <fname>Jane</fname>
    <mname>Mary</mname>
    <lname>Smith</lname>
   </name>
   <age>23</age>
  </person>
  <person>
   <name>
    <fname>Frank</fname>
    <mname>Joseph</mname>
    <lname>Franks</lname>
   </name>
   <age>23</age>
  </person>
 </people>
</root>
I'd like to sort and group it by age, such that each person of the same age
is placed in ascending order within each unique age value.
Here's what I have so far.
<?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="byAge" match="person" use="age"/>
 <xsl:template match="/">
  <people>
   <xsl:apply-templates select="root/people/person">
    <xsl:sort select="age" data-type="number" order="ascending"/>
   </xsl:apply-templates>
   <xsl:apply-templates mode="personGrouped"
	select="root/people/person[generate-id()=generate-id(key('byAge',
age)[1])]"/>
  </people>
 </xsl:template>
 <xsl:template match="person" mode="personGrouped">
  <age>
   <xsl:attribute name="value"><xsl:value-of select="age"/></xsl:attribute>
   <name>
    <fname><xsl:value-of select="name/fname"/></fname>
    <mname><xsl:value-of select="name/mname"/></mname>
    <lname><xsl:value-of select="name/lname"/></lname>
   </name>
  </age>
 </xsl:template>
</xsl:stylesheet>
Here's the output after processing...
<?xml version="1.0" encoding="UTF-8"?>
<people>JackFredSmith22JaneMarySmith23FrankJosephFranks23
 <age value="22">
  <name>
   <fname>Jack</fname>
   <mname>Fred</mname>
   <lname>Smith</lname>
  </name>
 </age>
 <age value="23">
  <name>
   <fname>Jane</fname>
   <mname>Mary</mname>
   <lname>Smith</lname>
  </name>
 </age>
</people>
Here is the output I would like to see...
<?xml version="1.0" encoding="UTF-8"?>
<people>
 <age value="22">
  <name>
   <fname>Jack</fname>
   <mname>Fred</mname>
   <lname>Smith</lname>
  </name>
 </age>
 <age value="23">
  <name>
   <fname>Frank</fname>
   <mname>Joseph</mname>
   <lname>Franks</lname>
  </name>
  <name>
   <fname>Jane</fname>
   <mname>Mary</mname>
   <lname>Smith</lname>
  </name>
 </age>
</people>
Thanks for your feedback.
Regards,
ASP
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] How to create a node set , Rush Manbert | Thread | Re: [xsl] XSLT 1.0 Grouping, Mukul Gandhi | 
| Re: [xsl] If Current Node Is Ancest, Brian Chrisman | Date | [xsl] Transformation problem tei > , Daniel O'Donnell | 
| Month |