[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Break on first - question

Subject: Re: Break on first - question
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Mon, 6 Jan 2003 14:14:59 +0000
jeni finch
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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.