Subject: Re: [xsl] Multi-grouping with keys (back of book index) From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> Date: Sat, 21 Oct 2006 12:26:39 -0700 |
This is XSLT 2.0, so it is much more easier -- in particular one doesn't need to use keys and the Muenchian method:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output method="text"/>
<xsl:template match="/*"> <xsl:for-each-group select="indexterm" group-by="substring(@name,1,1)"> <xsl:sort select="current-grouping-key()"/> <xsl:text>

</xsl:text>
<xsl:for-each-group select="current-group()" group-by="@name"> <xsl:sort select="current-grouping-key()"/>
<xsl:text>
</xsl:text> <xsl:value-of select="current-grouping-key()"/>
<xsl:for-each select="current-group()[normalize-space()]"> <xsl:value-of select="concat('
-',.)"/> </xsl:for-each> </xsl:for-each-group> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
-- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play
Hi, I am building a back of the book index using keys and grouping. I am able to group the <indexterms> to the @name attribute, but I can't figure out how to group the @name attribute to its respective letter. My desired output is:
Desired output:
E E190 -Aircraft Tail -Landing Gear Election -voting
G GMM -Aircraft Logbook Entry -MX-4 Deffered Items
S Smith Airways -MEL Policy and Revision number
Here is my XML:
<book> <indexterm name="GMM">Aircraft Logbook Entry</indexterm> <indexterm name="Smith Airways">MEL Policy and Revision number</indexterm> <indexterm name="GMM">MX-4 Deffered Items</indexterm> <indexterm name="E190">Aircraft Tail</indexterm> <indexterm name="E190">Landing Gear</indexterm> <indexterm name="Election">Voting</indexterm> </book>
Here is my XSL 2.0:
<xsl:output method="html"/> <xsl:variable name="XML1" select="/"/> <xsl:key name="list" match="//indexterm" use="@name"/> <xsl:key name="letter" match="//indexterm" use="substring(@name, 1,1)"/> <xsl:template match="/"> <html> <head> <title>Manual Index</title> </head> <style type="text/css"> h2 {font-family:verdana,helvetica,sans-serif;font-size:13pt} li {font-family:verdana,helvetica,sans-serif;font-size:11pt} </style> <body> <xsl:for-each select="$XML1"> <xsl:for-each select="//indexterm[generate-id(.)=generate-id(key('list', @name))]/@name"> <xsl:sort/> <xsl:variable name="key" select="translate(substring(.,1,1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/> <xsl:value-of select="$key"/> <xsl:for-each select="//indexterm[generate-id(.)=generate-id(key('list', @name))]/@name"> <xsl:sort/> <xsl:variable name="get" select="../@name"/> <h2>
<xsl:value-of select="."/> </h2> <ul>
<xsl:for-each select="key('list', $get)">
<xsl:sort/> <li>
<xsl:value-of select="."/>
</li>
</xsl:for-each> </ul> </xsl:for-each> </xsl:for-each> </xsl:for-each> </body> </html> </xsl:template>
Thanks for the help.
Phil
-- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Multi-grouping with keys , Mukul Gandhi | Thread | Re: [xsl] Multi-grouping with keys , Jirka Kosek |
Re: [xsl] Multi-grouping with keys , G. Ken Holman | Date | RE: [xsl] Multi-grouping with keys , philip vallone |
Month |