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>
 | <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>
 | <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/