Subject: Re: [xsl] Break on first - question From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Mon, 6 Jan 2003 14:14:59 +0000 |
Hi, > Note: Since this is my calendar, I can write the startDate and endDate as > xsl:date (<startDate>2003-01-25</startDate>), and in fact would prefer to. If you did, you would currently have to extract the year, month and day using substring() or similar; that's probably not a particular hardship, in fact with the grouping that you want to do it's marginally easier, so I'm going to assume that you've done this. > I have many EVENT records and need to sort them (I can do the sort > just fine) by date and title, and then produce HTML that breaks on > each new month (or year) so I can insert some formatting etc.. So > it's a grouping issue. How in the world do I do it? Whatever I try > gives me some success (=complete failure) but I can't get every new > month to behave itself. Using the Muenchian Method, create a key that indexes your <EVENT> elements by the month (and year) of their <eventDate>: <xsl:key name="events" match="EVENT" use="substring(venue/eventDate/startDate, 1, 7)" /> Now you can get all the events that start in January 2003 with the function call: key('events', '2003-01') So given a particular event you could create a list of all the events that occurred in the same month as that event, sorted by their date, using: <xsl:template match="EVENT" mode="month-group"> <xsl:variable name="month" select="substring(venue/eventDate/startDate, 1, 7)" /> <h3><xsl:value-of select="$month" /></h3> <xsl:apply-templates select="key('events', $month)" mode="details"> <xsl:sort select="venue/eventDate/startDate" /> </xsl:apply-templates> </xsl:template> (Assuming that you have a template matching EVENT elements in details mode that gives the details about an EVENT.) You only want to process the first EVENT of each month using the month-group template above, so you have to apply templates to only that set of elements. This is where the Muenchian trick comes in. Use: <xsl:apply-templates mode="month-group" select="EVENT[generate-id() = generate-id( key('events', substring(venue/eventDate/startDate, 1, 7))[1])]"> <xsl:sort select="venue/eventDate/startDate" /> </xsl:apply-templates> This selects the first listed EVENT for each month, sorts them in date order, and applies templates to them in month-group mode. Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Break on first - question, dhopp | Thread | [xsl] passing xsl:value-of to HREF, Lee, Insoo |
Re: [xsl] Autonumbering with XSLT, Peter Finch | Date | [xsl] creating page links, Sam Carleton |
Month |