3 level grouping

Subject: 3 level grouping
From: Nathan Shaw <n8_shaw@xxxxxxxxx>
Date: Tue, 8 Jun 2004 14:15:40 -0700 (PDT)
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="{@obprcal:category} Calendar">
			<xsl:if test="$l_timeperiodUrlSafe = ''">
				<br/>
				<a
href="webcal://spaceresearch.nasa.gov/calendar/OBPR_{@obprcal:category}.vcs"
printURL="yes">Subscribe to this category's iCal</a>
&#160;|&#160;<a
href="http://spaceresearch.nasa.gov/calendar/OBPR_{@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/ 

Current Thread