xsl-list
[Top] [All Lists]

3 level grouping

2004-06-08 14:15:40
Hi all. I am using the Meunchian method to group some
event calendar output. It is currently only grouped by
two levels, those being year and month. However, the
requirements have changed and I now need to group the
output by category, then year and then month. I cannot
figure out how to do this. Could someone lend a hand?
The relevant XML and XSLT is listed below. Thank you
very much in advance!

XML
<obprcal:top
xmlns="http://spaceresearch.nasa.gov/calendar";
xmlns:obprcal="http://spaceresearch.nasa.gov/calendar";
xmlns:xcal="http://www.ietf.org/internet-drafts/draft-ietf-calsch-many-xcal-01.txt";>
<xcal:vcalendar xcal:version="2.0"
xcal:prodid="-//nasa.gov/NONSGML Code U Extranet
Calendar Service//EN" obprcal:category="Education
Events" obprcal:timeperiod="">
                <xcal:vevent>
                        <obprcal:timeframe/>
                        <obprcal:eventid>29</obprcal:eventid>
                        <xcal:summary>A test future event.</xcal:summary>
                        <xcal:location>Home</xcal:location>
                        <xcal:categories>Education Events</xcal:categories>
                        <xcal:dtstart>20040212</xcal:dtstart>
                        <obprcal:dtstart_year>2004</obprcal:dtstart_year>
                        <obprcal:dtstart_month>02</obprcal:dtstart_month>
                        <obprcal:dtstart_day>12</obprcal:dtstart_day>
                        <obprcal:dtstart_hour>00</obprcal:dtstart_hour>
                        <obprcal:dtstart_minute>00</obprcal:dtstart_minute>
                        <obprcal:dtstart_second>00</obprcal:dtstart_second>
                        <xcal:dtend>20040212</xcal:dtend>
                        <obprcal:dtend_year>2004</obprcal:dtend_year>
                        <obprcal:dtend_month>02</obprcal:dtend_month>
                        <obprcal:dtend_day>12</obprcal:dtend_day>
                        <obprcal:dtend_hour>00</obprcal:dtend_hour>
                        <obprcal:dtend_minute>00</obprcal:dtend_minute>
                        <obprcal:dtend_second>00</obprcal:dtend_second>
                        <xcal:url>url</xcal:url>
                </xcal:vevent>
                <xcal:vevent>
                        <obprcal:timeframe/>
                        <obprcal:eventid>27</obprcal:eventid>
                        <xcal:summary>Education future</xcal:summary>
                        <xcal:location>Your place</xcal:location>
                        <xcal:categories>Education Events</xcal:categories>
                        <xcal:dtstart>20040210T080000</xcal:dtstart>
                        <obprcal:dtstart_year>2004</obprcal:dtstart_year>
                        <obprcal:dtstart_month>02</obprcal:dtstart_month>
                        <obprcal:dtstart_day>10</obprcal:dtstart_day>
                        <obprcal:dtstart_hour>08</obprcal:dtstart_hour>
                        <obprcal:dtstart_minute>00</obprcal:dtstart_minute>
                        <obprcal:dtstart_second>00</obprcal:dtstart_second>
                        <xcal:dtend>20040210T170000</xcal:dtend>
                        <obprcal:dtend_year>2004</obprcal:dtend_year>
                        <obprcal:dtend_month>02</obprcal:dtend_month>
                        <obprcal:dtend_day>10</obprcal:dtend_day>
                        <obprcal:dtend_hour>17</obprcal:dtend_hour>
                        <obprcal:dtend_minute>00</obprcal:dtend_minute>
                        <obprcal:dtend_second>00</obprcal:dtend_second>
                        <xcal:url>url</xcal:url>
                </xcal:vevent>
</xcal:vcalendar>
<xcal:vcalendar xcal:version="2.0"
xcal:prodid="-//nasa.gov/NONSGML Code U Extranet
Calendar Service//EN" obprcal:category="General
Interest" obprcal:timeperiod="">
                <xcal:vevent>
                        <obprcal:timeframe/>
                        <obprcal:eventid>29</obprcal:eventid>
                        <xcal:summary>A test future event.</xcal:summary>
                        <xcal:location>Home</xcal:location>
                        <xcal:categories>Education Events</xcal:categories>
                        <xcal:dtstart>20040212</xcal:dtstart>
                        <obprcal:dtstart_year>2004</obprcal:dtstart_year>
                        <obprcal:dtstart_month>02</obprcal:dtstart_month>
                        <obprcal:dtstart_day>12</obprcal:dtstart_day>
                        <obprcal:dtstart_hour>00</obprcal:dtstart_hour>
                        <obprcal:dtstart_minute>00</obprcal:dtstart_minute>
                        <obprcal:dtstart_second>00</obprcal:dtstart_second>
                        <xcal:dtend>20040212</xcal:dtend>
                        <obprcal:dtend_year>2004</obprcal:dtend_year>
                        <obprcal:dtend_month>02</obprcal:dtend_month>
                        <obprcal:dtend_day>12</obprcal:dtend_day>
                        <obprcal:dtend_hour>00</obprcal:dtend_hour>
                        <obprcal:dtend_minute>00</obprcal:dtend_minute>
                        <obprcal:dtend_second>00</obprcal:dtend_second>
                        <xcal:url>url</xcal:url>
                </xcal:vevent>
                <xcal:vevent>
                        <obprcal:timeframe/>
                        <obprcal:eventid>27</obprcal:eventid>
                        <xcal:summary>Education future</xcal:summary>
                        <xcal:location>Your place</xcal:location>
                        <xcal:categories>Education Events</xcal:categories>
                        <xcal:dtstart>20040210T080000</xcal:dtstart>
                        <obprcal:dtstart_year>2004</obprcal:dtstart_year>
                        <obprcal:dtstart_month>02</obprcal:dtstart_month>
                        <obprcal:dtstart_day>10</obprcal:dtstart_day>
                        <obprcal:dtstart_hour>08</obprcal:dtstart_hour>
                        <obprcal:dtstart_minute>00</obprcal:dtstart_minute>
                        <obprcal:dtstart_second>00</obprcal:dtstart_second>
                        <xcal:dtend>20040210T170000</xcal:dtend>
                        <obprcal:dtend_year>2004</obprcal:dtend_year>
                        <obprcal:dtend_month>02</obprcal:dtend_month>
                        <obprcal:dtend_day>10</obprcal:dtend_day>
                        <obprcal:dtend_hour>17</obprcal:dtend_hour>
                        <obprcal:dtend_minute>00</obprcal:dtend_minute>
                        <obprcal:dtend_second>00</obprcal:dtend_second>
                        <xcal:url>url</xcal:url>
                </xcal:vevent>
</xcal:vcalendar>
</obprcal:top>


XSLT:
<xsl:key name="kStartDateYear" match="xcal:vevent"
use="obprcal:dtstart_year"/>
        <xsl:key name="kStartDateMonth" match="xcal:vevent"
use="concat(obprcal:dtstart_year,obprcal:dtstart_month)"/>
        <xsl:key name="kCategory" match="xcal:vevent"
use="xcal:categories"/>

<!-- VCALENDAR -->
        <xsl:template match="xcal:vcalendar">
                <xsl:variable name="currCategory"
select="@obprcal:category"/>
                <Section Title="{(_at_)obprcal:category} Calendar">
                        <xsl:if test="$l_timeperiodUrlSafe = ''">
                                <br/>
                                <a
href="webcal://spaceresearch.nasa.gov/calendar/OBPR_{(_at_)obprcal:category}.vcs"
printURL="yes">Subscribe to this category's iCal</a>
&#160;|&#160;<a
href="http://spaceresearch.nasa.gov/calendar/OBPR_{(_at_)obprcal:category}.vcs"
printURL="yes">Download this category's iCal</a>
                                <!-- the use of the $webhost variable is 
commented
out for now until we figure out a better way to handle
generating the proper URL
                                                <a
href="webcal://{$webhost}/calendar/OBPR_{$l_categoryUrlSafe}.vcs"
printURL="yes">Subscribe to this category's iCal</a>
&#160;|&#160;<a
href="http://{$webhost}/calendar/OBPR_{$l_categoryUrlSafe}.vcs";
printURL="yes">Download this category's iCal</a>
                                -->
                        </xsl:if>
                </Section>
                <xsl:for-each select="xcal:vevent[count(. |
key('kCategory', xcal:categories)[1]) = 1]">
                        <xsl:for-each select="key('kStartDateYear',
obprcal:dtstart_year)[count(.|key('kStartDateYear',obprcal:dtstart_year)[1])
= 1]">
                                <xsl:sort select="obprcal:dtstart_year"
data-type="number" order="descending"/>
                                <Section Title="{obprcal:dtstart_year}">
                                        <xsl:for-each 
select="key('kStartDateYear', 
obprcal:dtstart_year)[count(.|key('kStartDateMonth',
concat(obprcal:dtstart_year,obprcal:dtstart_month))[1])
= 1]">
                                                <xsl:sort 
select="obprcal:dtstart_month"
data-type="number" order="descending"/>
                                                <xsl:variable name="monthName">
                                                        <xsl:call-template 
name="dt:get-month-name">
                                                                <xsl:with-param 
name="month"
select="obprcal:dtstart_month"/>
                                                        </xsl:call-template>
                                                </xsl:variable>
                                                <SubSection 
Title="{$monthName}">
                                                        <br/>
                                                        <xsl:for-each 
select="key('kStartDateMonth',
concat(obprcal:dtstart_year,obprcal:dtstart_month))">
                                                                <DataTable 
CellSpacing="0" CellPadding="2"
Border="0">
                                                                        
<xsl:apply-templates select="xcal:summary"/>
                                                                        
<xsl:call-template name="StartEndDateTime"/>
                                                                        
<xsl:apply-templates
select="xcal:categories"/>
                                                                        
<xsl:apply-templates select="xcal:location"/>
                                                                        
<xsl:apply-templates
select="xcal:description"/>
                                                                        
<xsl:apply-templates select="xcal:url"/>
                                                                </DataTable>
                                                                <br/>
                                                        </xsl:for-each>
                                                        <br/>
                                                </SubSection>
                                        </xsl:for-each>
                                </Section>
                        </xsl:for-each>
                </xsl:for-each>
        </xsl:template>



        
                
__________________________________
Do you Yahoo!?
Friends.  Fun.  Try the all-new Yahoo! Messenger.
http://messenger.yahoo.com/ 


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