Subject: RE: [xsl] Working with xs:date and xs:gYearMonth From: "Michael Kay" <mhk@xxxxxxxxx> Date: Wed, 23 Jun 2004 04:19:58 +0100 |
The gXX types aren't very well supported by functions and operators in XPath 2.0, in fact, they're a bit of a dead end, as you've discovered. They don't even support ordering comparisons. I personally find that for any serious work using dates and durations, it's much easier to do it using numbers than using the purpose-built data types. A useful trick is to convert a yearMonthDuration to an integer number of months by dividing by P1M, and to convert back by multiplying by P1M. You can represent the current month as <xsl:variable name="current-month" select="year-from-date($today)*12 + month-from-date($today)" as="xs:integer"/> and then get the previous month as <xsl:variable name="previous-month" select="$current-month - 1" as="xs:integer"/> and you can get the date on the first of the previous month as <xsl:variable name="one-month" select="xs:yearMonthDuration('P1M')" as="xdt:yearMonthDuration"/> <xsl:variable name="first-of-previous-month" select="xs:date('0000-01-01') + ($previous-month * $one-month)" as="xs:date"/> Michael Kay > -----Original Message----- > From: Colin Paul Adams [mailto:colin@xxxxxxxxxxxxxxxxxx] > Sent: 22 June 2004 20:06 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Working with xs:date and xs:gYearMonth > > I'm trying to write a transform for generating calendards from some > xml event data. > > I shall want to highlight the entry for today (if the calendar happens > to be displaying the current month), so I set up a global variable > named today: > > > <xsl:variable name="today" select="current-date()" as="xs:date"/> > > I also want to be able to pass a parameter to name the month to > display, defaulting to the current month, so: > > <xsl:param name="date" select="xs:gYearMonth($today)" > as="xs:gYearMonth"/> > > As I want to generate a hyperlink to the previous month, I want a > variable that I can put into the query string of a URL so: > > <xsl:variable name="previous_month" > select="xs:gYearMonth(xs:date($date) - > xdt:yearMonthDuration('P0Y1M'))" as="xs:gYearMonth"/> > > But when I try to reference this variable: > > <th id="lastmonth"><a > href="/onevoice/members/calendar?date='{$previous_month}'"> > 71;</a></th> > > saxon (8.0b) gives me: > > Error at attribute on line 60 of > file:/home/colin/onevoice/members/calendar.xsl: > Cannot convert gYearMonth to xs:date > Transformation failed: Run-time errors were reported > > How am I supposed to go about this? > -- > Colin Paul Adams > Preston Lancashire > > --+------------------------------------------------------------------ > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/ > or e-mail: <mailto:xsl-list-unsubscribe@xxxxxxxxxxxxxxxxxxxxxx> > --+-- > >
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Working with xs:date and xs:gYearMo, Colin Paul Adams | Thread | Re: [xsl] Working with xs:date and , Colin Paul Adams |
Re: [xsl] Converting HTML to plain , Larry Kollar | Date | Re: [xsl] Working with xs:date and , Colin Paul Adams |
Month |