Oana Groza
Oana Groza

Reputation: 31

xslt grouping list

I have the xml file with a simple form and I want to display the content with xslt (1.0) in a list grouped by category, the books to be grouped by the category field. An idea for this? thanks

I am not quite familiar with xslt...and i did not find something clear regarding this so any help is welcomed

<collection>

    <book>
            <title>Sushi for dummies</title>
            <author>Judi Strada</author>
            <category>Cooking</category>
            <year>2001</year>
            <isbn>95641022</isbn>
    </book>

    <book>
            <title>Sixties Design</title>
            <author>Philippe Garner</author>
            <category>Design</category>
            <year>2007</year>
            <isbn>64781365</isbn>
    </book>

    <book>
            <title>Final Jeopardy</title>
            <author>Stephen Baker</author>
            <category>Computer Science</category>
            <year>2011</year>
            <isbn>8316363546</isbn>
    </book>

    <book>
            <title>Spoon river anthology</title>
            <author>Edgar Lee Masters</author>
            <category>Poetry</category>
            <year>1973</year>
            <isbn>21565648362</isbn>
    </book>

    <book>
            <title>The dark is rising</title>
            <author>Susan Cooper</author>
            <category>Philosophy</category>
            <year>1973</year>
            <isbn>47884564151</isbn>
    </book>

            <book>
            <title>The graphic alphabet</title>
            <author>David Pelletier</author>
            <category>Design</category>
            <year>1996</year>
            <isbn>1322456655</isbn>
    </book>

    <book>
            <title>Pattern Recognition and Machine Learning</title>
            <author>Christopher M. Bishop</author>
            <category>Computer Science</category>
            <year>2006</year>
            <isbn>45456531073</isbn>
    </book>

</collection>

Upvotes: 2

Views: 357

Answers (2)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243449

This is called "Muenchian grouping":

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kBooksByCat" match="book" use="category"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "book
   [generate-id()
   =
    generate-id(key('kBooksByCat', category)[1])
   ]
 ">
  <category name="{category}">
   <xsl:copy-of select="key('kBooksByCat', category)"/>
  </category>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<collection>
    <book>
        <title>Sushi for dummies</title>
        <author>Judi Strada</author>
        <category>Cooking</category>
        <year>2001</year>
        <isbn>95641022</isbn>
    </book>
    <book>
        <title>Sixties Design</title>
        <author>Philippe Garner</author>
        <category>Design</category>
        <year>2007</year>
        <isbn>64781365</isbn>
    </book>
    <book>
        <title>Final Jeopardy</title>
        <author>Stephen Baker</author>
        <category>Computer Science</category>
        <year>2011</year>
        <isbn>8316363546</isbn>
    </book>
    <book>
        <title>Spoon river anthology</title>
        <author>Edgar Lee Masters</author>
        <category>Poetry</category>
        <year>1973</year>
        <isbn>21565648362</isbn>
    </book>
    <book>
        <title>The dark is rising</title>
        <author>Susan Cooper</author>
        <category>Philosophy</category>
        <year>1973</year>
        <isbn>47884564151</isbn>
    </book>
    <book>
        <title>The graphic alphabet</title>
        <author>David Pelletier</author>
        <category>Design</category>
        <year>1996</year>
        <isbn>1322456655</isbn>
    </book>
    <book>
        <title>Pattern Recognition and Machine Learning</title>
        <author>Christopher M. Bishop</author>
        <category>Computer Science</category>
        <year>2006</year>
        <isbn>45456531073</isbn>
    </book>
</collection>

the wanted, correctly grouped result is produced:

<collection>
   <category name="Cooking">
      <book>
         <title>Sushi for dummies</title>
         <author>Judi Strada</author>
         <category>Cooking</category>
         <year>2001</year>
         <isbn>95641022</isbn>
      </book>
   </category>
   <category name="Design">
      <book>
         <title>Sixties Design</title>
         <author>Philippe Garner</author>
         <category>Design</category>
         <year>2007</year>
         <isbn>64781365</isbn>
      </book>
      <book>
         <title>The graphic alphabet</title>
         <author>David Pelletier</author>
         <category>Design</category>
         <year>1996</year>
         <isbn>1322456655</isbn>
      </book>
   </category>
   <category name="Computer Science">
      <book>
         <title>Final Jeopardy</title>
         <author>Stephen Baker</author>
         <category>Computer Science</category>
         <year>2011</year>
         <isbn>8316363546</isbn>
      </book>
      <book>
         <title>Pattern Recognition and Machine Learning</title>
         <author>Christopher M. Bishop</author>
         <category>Computer Science</category>
         <year>2006</year>
         <isbn>45456531073</isbn>
      </book>
   </category>
   <category name="Poetry">
      <book>
         <title>Spoon river anthology</title>
         <author>Edgar Lee Masters</author>
         <category>Poetry</category>
         <year>1973</year>
         <isbn>21565648362</isbn>
      </book>
   </category>
   <category name="Philosophy">
      <book>
         <title>The dark is rising</title>
         <author>Susan Cooper</author>
         <category>Philosophy</category>
         <year>1973</year>
         <isbn>47884564151</isbn>
      </book>
   </category>
   <book>
      <title>The graphic alphabet</title>
      <author>David Pelletier</author>
      <category>Design</category>
      <year>1996</year>
      <isbn>1322456655</isbn>
   </book>
   <book>
      <title>Pattern Recognition and Machine Learning</title>
      <author>Christopher M. Bishop</author>
      <category>Computer Science</category>
      <year>2006</year>
      <isbn>45456531073</isbn>
   </book>
</collection>

Upvotes: 0

Mike Chamberlain
Mike Chamberlain

Reputation: 407

Try the following.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <!-- create an index of book nodes group by category -->
  <xsl:key name="bookindex" match="book" use="category"/>

  <xsl:template match="collection">
    <collections>
       <!-- select book nodes which are the first node in their relevant index -->
       <!-- this basically selects the node which has the same id as the first node
            returned from the index -->
       <xsl:apply-templates 
          select="book[generate-id() = 
                       generate-id(key('bookindex', category)[1])]"
            mode="group"/>
    </collections>
  </xsl:template>

  <!-- handle the first node as the group pivot -->
  <xsl:template match="book" mode="group">
    <group>
       <category><xsl:value-of select="category"/></category>
       <!-- select all book nodes which have the same category as myself -->
       <xsl:apply-templates select="../book[category=current()/category]"/>
    </group>
  </xsl:template>

  <!-- now handle each node in the book list -->
  <xsl:template match="book">
          <title><xsl:value-of select="title"/></title>
  </xsl:template>

</xsl:stylesheet>

Upvotes: 1

Related Questions