Reputation: 31
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
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
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