xsl-list
[Top] [All Lists]

Re: second level grouping in XSLT 1.0

2004-08-07 00:35:24
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(_at_)ccla(_dot_)lib(_dot_)fl(_dot_)us> 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 


<Prev in Thread] Current Thread [Next in Thread>