|
Subject: Re: [xsl] Working with xs:date and xs:gYearMonth From: Colin Paul Adams <colin@xxxxxxxxxxxxxxxxxx> Date: 24 Jun 2004 14:43:53 +0100 |
>>>>> "Michael" == Michael Kay <mhk@xxxxxxxxx> writes:
Michael> Saxon's date arithmetic on BC dates is probably
Michael> unreliable because of these problems, it's not something
Michael> that is very well tested. It would be safer to use a
Michael> later date as a baseline.
Well, rather than use a baseline at all, since I am only interested in
the previous and following months in the 21st century for my
application, I came up with the following safe (if somewhat verbose)
solution:
<xsl:variable name="today" select="current-date ()" as="xs:date"/>
<xsl:param name="date" select="$today" as="xs:date"/>
<xsl:variable name="current-month" select="year-from-date ($date)*12 + month-from-date ($date)" as="xs:integer"/>
<xsl:variable name="first-of-previous-month" as="xs:date">
<xsl:variable name="local-month-1" select="month-from-date ($date) - 1" as="xs:integer"/>
<xsl:variable name="local-month-2" as="xs:integer">
<xsl:choose>
<xsl:when test="$local-month-1 eq 0"><xsl:value-of select="xs:integer (12)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$local-month-1"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="local-year" as="xs:integer">
<xsl:choose>
<xsl:when test="$local-month-2 eq 12"><xsl:value-of select="year-from-date ($date) - 1" /></xsl:when>
<xsl:otherwise><xsl:value-of select="year-from-date ($date)" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="local-date" select="concat (format-number ($local-year, '####'), '-', format-number ($local-month-2, '00'), '-01')" as="xs:string"/>
<xsl:value-of select="xs:date ($local-date)"/>
</xsl:variable>
<xsl:variable name="first-of-following-month" as="xs:date">
<xsl:variable name="local-month-1" select="month-from-date ($date) + 1" as="xs:integer"/>
<xsl:variable name="local-month-2" as="xs:integer">
<xsl:choose>
<xsl:when test="$local-month-1 eq 13"><xsl:value-of select="xs:integer (1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$local-month-1"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="local-year" as="xs:integer">
<xsl:choose>
<xsl:when test="$local-month-2 eq 1"><xsl:value-of select="year-from-date ($date) + 1" /></xsl:when>
<xsl:otherwise><xsl:value-of select="year-from-date ($date)" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="local-date" select="concat (format-number ($local-year, '####'), '-', format-number ($local-month-2, '00'), '-01')" as="xs:string"/>
<xsl:value-of select="xs:date ($local-date)"/>
</xsl:variable>
I suppose I could generalize these into functions taking a duration,
and performing iteraton, but I have no need.
--
Colin Paul Adams
Preston Lancashire
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Working with xs:date and , Colin Paul Adams | Thread | RE: [xsl] Working with xs:date and , Michael Kay |
| newline headaches in text output, Butler Adam | Date | Re: [xsl] newline headaches in text, George Cristian Bina |
| Month |