Subject: Re: [xsl] second level grouping in XSLT 1.0 From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx> Date: Sat, 7 Aug 2004 00:35:24 -0700 (PDT) |
Hi Susan, Please try this stylesheet. It uses the nodeset extension function. <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan"> <xsl:output method="html" indent="yes"/> <xsl:key name="by-library" match="section-02" use="library" /> <xsl:key name="by-collection" match="temp/section-02" use="collection" /> <xsl:template match="/root"> <html> <head> <title></title> </head> <body> <table border="1"> <xsl:for-each select="section-02[generate-id(.) = generate-id(key('by-library', library)[1])]"> <xsl:sort select="library" /> <tr> <td><xsl:value-of select="library" /></td> </tr> <xsl:variable name="rtf"> <temp> <xsl:copy-of select="key('by-library', library)" /> </temp> </xsl:variable> <xsl:for-each select="xalan:nodeset($rtf)/temp/section-02[generate-id(.) = generate-id(key('by-collection', collection)[1])]"> <xsl:sort select="collection" /> <tr> <td><xsl:value-of select="collection" /></td> <td><xsl:value-of select="count(key('by-collection', collection))" /></td> </tr> </xsl:for-each> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Regards, Mukul --- Susan Campbell <SCampbell@xxxxxxxxxxxxxx> wrote: > Greetings, > I am unable to get second level grouping to work. I > suspect I need to use the second key I have defined, > but I'm not sure how to use it. I now get more > information than I want/need but I don't know how to > limit it and when I do, I'm not sure how to count > it. Any help will be greatly appreciated. > Thanks, > Susan > > Here's what I want (in a table): > Jacksonville > Audio-Visual 2 > Circulation 1 > Miami > Circulation 1 > Melbourne > Children's 1 > Orlando > Reserves 1 > Tampa > Circulation 2 > Reference 1 > > My xml looks like this: > <section-02> > <number>57189<number> > <library>TAMPA<library> > <collection>Circulation<collection> > <section-02> > <section-02> > <number>57199<number> > <library>TAMPA<library> > <collection>Circulation<collection> > <section-02> > <section-02> > <number>57179<number> > <library>TAMPA<library> > <collection>Reference<collection> > <section-02> > <section-02> > <number>57169<number> > <library>JACKSONVILLE<library> > <collection>Audio-Visual<collection> > <section-02> > <section-02> > <number>57159<number> > <library>JACKSONVILLE<library> > <collection>Circulation<collection> > <section-02> > <section-02> > <number>57159<number> > <library>JACKSONVILLE<library> > <collection>Audio-Visual<collection> > <section-02> > <section-02> > <number>57109<number> > <library>ORLANDO<library> > <collection>Reserves<collection> > <section-02> > <section-02> > <number>57239<number> > <library>MIAMI<library> > <collection>Circulation<collection> > <section-02> > <section-02> > <number>57000<number> > <library>MELBOURNE<library> > <collection>Children's<collection> > <section-02> > > And the xslt I've been trying with looks like this > (comment show where I know I'm wrong): > <xsl:stylesheet > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > <xsl:include href="funcs.xsl"/> > <xsl:key name="kCampus" match="section-02" > use="library"/> > <xsl:key name="kCollection" match="section-02" > use="concat(library, ':', collection)"/> > > <xsl:template match="/"> > <xsl:call-template name="header"/> > <xsl:call-template name="BuildGrid"/> > </xsl:template> > > <xsl:template name="header"> > <xsl:call-template name="header-gen"> > <xsl:with-param name="title" select="'Number > of loans by campus and collection'"/> > </xsl:call-template> > </xsl:template> > > > <xsl:template name="BuildGrid"> > <center> > <table border='1'> > <xsl:for-each select="//section-02[generate-id() > = generate-id(key('kCampus', library))]"> > <xsl:sort select="library" order="ascending"/> > <tr> > <td colspan='3' align='center'> > <xsl:value-of select="."/> > </td> > </tr> > <!-- not what I need, I need each collection > only once > per campus when relevant and then a count for > each collection --> > <xsl:apply-templates > select="//section-02[library = current()/library]" > mode="collection"> > <xsl:sort select="collection" order="ascending"/> > </xsl:apply-templates> > </xsl:for-each> > </table> > </center> > </xsl:template> > > <xsl:template match="section-02" mode="collection"> > <tr> > <td> > <xsl:value-of select="collection"/> > </td> > <td> > <!-- placeholder for count of nodes by > collection/campus --> > <xsl:value-of select="'loans'"/> > </td> > </tr> > </xsl:template> > </xsl:stylesheet> __________________________________ Do you Yahoo!? Yahoo! Mail Address AutoComplete - You start. We finish. http://promotions.yahoo.com/new_mail
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] second level grouping in XSLT, Susan Campbell | Thread | [xsl] syntax for passing variable i, Esther_Strom |
Re: [xsl] Merging Data, Mukul Gandhi | Date | [xsl] LimitPredicate, mankar |
Month |