Author: sjur
Date: Tue Oct 27 20:23:38 2009
New Revision: 830327
URL: http://svn.apache.org/viewvc?rev=830327&view=rev
Log:
EXSLT extension function needed for iCal output plugin.
Added:
forrest/trunk/main/webapp/resources/stylesheets/exslt/date/functions/add/
forrest/trunk/main/webapp/resources/stylesheets/exslt/date/functions/add/date.add.template.xsl
Added:
forrest/trunk/main/webapp/resources/stylesheets/exslt/date/functions/add/date.add.template.xsl
URL:
http://svn.apache.org/viewvc/forrest/trunk/main/webapp/resources/stylesheets/exslt/date/functions/add/date.add.template.xsl?rev=830327&view=auto
==============================================================================
---
forrest/trunk/main/webapp/resources/stylesheets/exslt/date/functions/add/date.add.template.xsl
(added)
+++
forrest/trunk/main/webapp/resources/stylesheets/exslt/date/functions/add/date.add.template.xsl
Tue Oct 27 20:23:38 2009
@@ -0,0 +1,397 @@
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:date="http://exslt.org/dates-and-times"
+ extension-element-prefixes="date">
+
+<date:month-lengths>
+ <date:month>31</date:month>
+ <date:month>28</date:month>
+ <date:month>31</date:month>
+ <date:month>30</date:month>
+ <date:month>31</date:month>
+ <date:month>30</date:month>
+ <date:month>31</date:month>
+ <date:month>31</date:month>
+ <date:month>30</date:month>
+ <date:month>31</date:month>
+ <date:month>30</date:month>
+ <date:month>31</date:month>
+</date:month-lengths>
+
+<xsl:template name="date:add">
+ <xsl:param name="date-time" />
+ <xsl:param name="duration" />
+ <xsl:variable name="dt-neg" select="starts-with($date-time, '-')" />
+ <xsl:variable name="dt-no-neg">
+ <xsl:choose>
+ <xsl:when test="$dt-neg or starts-with($date-time, '+')">
+ <xsl:value-of select="substring($date-time, 2)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$date-time" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="dt-no-neg-length" select="string-length($dt-no-neg)" />
+ <xsl:variable name="timezone">
+ <xsl:choose>
+ <xsl:when test="substring($dt-no-neg, $dt-no-neg-length) =
'Z'">Z</xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="tz" select="substring($dt-no-neg,
$dt-no-neg-length - 5)" />
+ <xsl:if test="(substring($tz, 1, 1) = '-' or
+ substring($tz, 1, 1) = '+') and
+ substring($tz, 4, 1) = ':'">
+ <xsl:value-of select="$tz" />
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="new-dt">
+ <xsl:if test="not(string($timezone)) or
+ $timezone = 'Z' or
+ (substring($timezone, 2, 2) <= 23 and
+ substring($timezone, 5, 2) <= 59)">
+ <xsl:variable name="dt" select="substring($dt-no-neg, 1,
$dt-no-neg-length - string-length($timezone))" />
+ <xsl:variable name="dt-length" select="string-length($dt)" />
+ <xsl:variable name="du-neg" select="starts-with($duration, '-')" />
+ <xsl:variable name="du">
+ <xsl:choose>
+ <xsl:when test="$du-neg"><xsl:value-of
select="substring($duration, 2)" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="$duration"
/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="starts-with($du, 'P') and
+ not(translate($du, '0123456789PYMDTHS.', ''))">
+ <xsl:variable name="du-date">
+ <xsl:choose>
+ <xsl:when test="contains($du, 'T')"><xsl:value-of
select="substring-before(substring($du, 2), 'T')" /></xsl:when>
+ <xsl:otherwise><xsl:value-of select="substring($du, 2)"
/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="du-time">
+ <xsl:if test="contains($du, 'T')"><xsl:value-of
select="substring-after($du, 'T')" /></xsl:if>
+ </xsl:variable>
+ <xsl:if test="(not($du-date) or
+ (not(translate($du-date, '0123456789YMD', '')) and
+ not(substring-after($du-date, 'D')) and
+ (contains($du-date, 'D') or
+ (not(substring-after($du-date, 'M')) and
+ (contains($du-date, 'M') or
+ not(substring-after($du-date, 'Y'))))))) and
+ (not($du-time) or
+ (not(translate($du-time, '0123456789HMS.', '')) and
+ not(substring-after($du-time, 'S')) and
+ (contains($du-time, 'S') or
+ not(substring-after($du-time, 'M')) and
+ (contains($du-time, 'M') or
+ not(substring-after($du-time, 'Y'))))))">
+ <xsl:variable name="duy-str">
+ <xsl:choose>
+ <xsl:when test="contains($du-date, 'Y')"><xsl:value-of
select="substring-before($du-date, 'Y')" /></xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="dum-str">
+ <xsl:choose>
+ <xsl:when test="contains($du-date, 'M')">
+ <xsl:choose>
+ <xsl:when test="contains($du-date,
'Y')"><xsl:value-of select="substring-before(substring-after($du-date, 'Y'),
'M')" /></xsl:when>
+ <xsl:otherwise><xsl:value-of
select="substring-before($du-date, 'M')" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="dud-str">
+ <xsl:choose>
+ <xsl:when test="contains($du-date, 'D')">
+ <xsl:choose>
+ <xsl:when test="contains($du-date,
'M')"><xsl:value-of select="substring-before(substring-after($du-date, 'M'),
'D')" /></xsl:when>
+ <xsl:when test="contains($du-date,
'Y')"><xsl:value-of select="substring-before(substring-after($du-date, 'Y'),
'D')" /></xsl:when>
+ <xsl:otherwise><xsl:value-of
select="substring-before($du-date, 'D')" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="duh-str">
+ <xsl:choose>
+ <xsl:when test="contains($du-time, 'H')"><xsl:value-of
select="substring-before($du-time, 'H')" /></xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="dumin-str">
+ <xsl:choose>
+ <xsl:when test="contains($du-time, 'M')">
+ <xsl:choose>
+ <xsl:when test="contains($du-time,
'H')"><xsl:value-of select="substring-before(substring-after($du-time, 'H'),
'M')" /></xsl:when>
+ <xsl:otherwise><xsl:value-of
select="substring-before($du-time, 'M')" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="dus-str">
+ <xsl:choose>
+ <xsl:when test="contains($du-time, 'S')">
+ <xsl:choose>
+ <xsl:when test="contains($du-time,
'M')"><xsl:value-of select="substring-before(substring-after($du-time, 'M'),
'S')" /></xsl:when>
+ <xsl:when test="contains($du-time,
'H')"><xsl:value-of select="substring-before(substring-after($du-time, 'H'),
'S')" /></xsl:when>
+ <xsl:otherwise><xsl:value-of
select="substring-before($du-time, 'S')" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="mult" select="($du-neg * -2) + 1" />
+ <xsl:variable name="duy" select="$duy-str * $mult" />
+ <xsl:variable name="dum" select="$dum-str * $mult" />
+ <xsl:variable name="dud" select="$dud-str * $mult" />
+ <xsl:variable name="duh" select="$duh-str * $mult" />
+ <xsl:variable name="dumin" select="$dumin-str * $mult" />
+ <xsl:variable name="dus" select="$dus-str * $mult" />
+
+ <xsl:variable name="year" select="substring($dt, 1, 4) *
(($dt-neg * -2) + 1)" />
+ <xsl:choose>
+ <xsl:when test="$year and
+ string($duy) = 'NaN' or
+ string($dum) = 'NaN' or
+ string($dud) = 'NaN' or
+ string($duh) = 'NaN' or
+ string($dumin) = 'NaN' or
+ string($dus) = 'NaN'" />
+ <xsl:when test="$dt-length > 4 or
+ $dum or $dud or $duh or $dumin or $dus">
+ <xsl:variable name="month">
+ <xsl:choose>
+ <xsl:when test="$dt-length > 4">
+ <xsl:if test="substring($dt, 5, 1) = '-'">
+ <xsl:value-of select="substring($dt, 6, 2)" />
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="not($month) or $month > 12" />
+ <xsl:when test="$dt-length > 7 or
+ $dud or $duh or $dumin or $dus">
+ <xsl:variable name="day">
+ <xsl:choose>
+ <xsl:when test="$dt-length > 7">
+ <xsl:if test="substring($dt, 8, 1) = '-'">
+ <xsl:value-of select="substring($dt, 9,
2)" />
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="not($day) or $day > 31" />
+ <xsl:when test="$dt-length > 10 or
+ $duh or $dumin or $dus">
+ <xsl:if test="$dt-length = 10 or
+ (substring($dt, 11, 1) = 'T' and
+ substring($dt, 14, 1) = ':' and
+ substring($dt, 17, 1) = ':')">
+ <xsl:variable name="hour">
+ <xsl:choose>
+ <xsl:when test="$dt-length >
10"><xsl:value-of select="substring($dt, 12, 2)" /></xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="minute">
+ <xsl:choose>
+ <xsl:when test="$dt-length >
10"><xsl:value-of select="substring($dt, 15, 2)" /></xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="second">
+ <xsl:choose>
+ <xsl:when test="$dt-length >
10"><xsl:value-of select="substring($dt, 18)" /></xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="$hour <= 23 and $minute
<= 59 and $second <= 60">
+ <xsl:variable name="new-second"
select="$second + $dus" />
+ <xsl:variable name="new-minute"
select="$minute + $dumin + floor($new-second div 60)" />
+ <xsl:variable name="new-hour"
select="$hour + $duh + floor($new-minute div 60)" />
+ <xsl:variable name="new-month"
select="$month + $dum" />
+ <xsl:call-template
name="date:_add-days">
+ <xsl:with-param name="year"
select="$year + $duy + floor(($new-month - 1) div 12)" />
+ <xsl:with-param name="month">
+ <xsl:variable name="m">
+ <xsl:choose>
+ <xsl:when test="$new-month
< 1"><xsl:value-of select="$new-month + 12" /></xsl:when>
+
<xsl:otherwise><xsl:value-of select="$new-month" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$m mod 12">
+ <xsl:value-of
select="format-number($m mod 12, '00')" />
+ </xsl:when>
+
<xsl:otherwise>12</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="day"
select="$day" />
+ <xsl:with-param name="days"
select="$dud + floor($new-hour div 24)" />
+ </xsl:call-template>
+ <xsl:text>T</xsl:text>
+ <xsl:value-of
select="format-number(($new-hour + 24) mod 24, '00')" />
+ <xsl:text>:</xsl:text>
+ <xsl:value-of
select="format-number($new-minute mod 60, '00')" />
+ <xsl:text>:</xsl:text>
+ <xsl:if test="$new-second mod 60 <
10">0</xsl:if>
+ <xsl:value-of select="$new-second mod
60" />
+ <xsl:value-of select="$timezone" />
+ </xsl:if>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="new-month" select="$month
+ $dum" />
+ <xsl:call-template name="date:_add-days">
+ <xsl:with-param name="year" select="$year
+ $duy + floor(($new-month - 1) div 12)" />
+ <xsl:with-param name="month">
+ <xsl:variable name="m">
+ <xsl:choose>
+ <xsl:when test="$new-month <
1"><xsl:value-of select="$new-month + 12" /></xsl:when>
+ <xsl:otherwise><xsl:value-of
select="$new-month" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$m mod 12">
+ <xsl:value-of
select="format-number($m mod 12, '00')" />
+ </xsl:when>
+ <xsl:otherwise>12</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="day" select="$day" />
+ <xsl:with-param name="days" select="$dud"
/>
+ </xsl:call-template>
+ <xsl:value-of select="$timezone" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="new-month" select="$month +
$dum" />
+ <xsl:value-of select="format-number($year + $duy +
floor(($new-month - 1) div 12), '0000')" />
+ <xsl:text>-</xsl:text>
+ <xsl:variable name="m">
+ <xsl:choose>
+ <xsl:when test="$new-month <
1"><xsl:value-of select="$new-month + 12" /></xsl:when>
+ <xsl:otherwise><xsl:value-of
select="$new-month" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$m mod 12">
+ <xsl:value-of select="format-number($m mod
12, '00')" />
+ </xsl:when>
+ <xsl:otherwise>12</xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$timezone" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="format-number($year + $duy,
'0000')" />
+ <xsl:value-of select="$timezone" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:if>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="string-length($date-time) > 10">
+ <xsl:value-of select="$new-dt" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring($new-dt, 1, string-length($date-time))"
/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="date:_add-days">
+ <xsl:param name="year" />
+ <xsl:param name="month" />
+ <xsl:param name="day" />
+ <xsl:param name="days" />
+ <xsl:param name="new-day" select="'NaN'" />
+ <xsl:variable name="leap" select="(not($year mod 4) and $year mod 100) or
not($year mod 400)" />
+ <xsl:variable name="month-days"
select="document('')/*/date:month-lengths/date:month" />
+ <xsl:variable name="days-in-month">
+ <xsl:choose>
+ <xsl:when test="$month = 2 and $leap">
+ <xsl:value-of select="$month-days[number($month)] + 1" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$month-days[number($month)]" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$new-day = 'NaN'">
+ <xsl:call-template name="date:_add-days">
+ <xsl:with-param name="year" select="$year" />
+ <xsl:with-param name="month" select="$month" />
+ <xsl:with-param name="new-day">
+ <xsl:choose>
+ <xsl:when test="$day > $days-in-month">
+ <xsl:value-of select="$days-in-month + $days" />
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$day + $days"
/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$new-day < 1">
+ <xsl:call-template name="date:_add-days">
+ <xsl:with-param name="year" select="$year - ($month = 1)" />
+ <xsl:with-param name="month">
+ <xsl:choose>
+ <xsl:when test="$month = 1">12</xsl:when>
+ <xsl:otherwise><xsl:value-of select="$month - 1"
/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="new-day">
+ <xsl:variable name="days-in-new-month">
+ <xsl:choose>
+ <xsl:when test="$leap and $month = 3">29</xsl:when>
+ <xsl:when test="$month = 1">31</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$month-days[$month - 1]" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$new-day + $days-in-new-month" />
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$new-day > $days-in-month">
+ <xsl:call-template name="date:_add-days">
+ <xsl:with-param name="year" select="$year + ($month = 12)" />
+ <xsl:with-param name="month">
+ <xsl:choose>
+ <xsl:when test="$month = 12">1</xsl:when>
+ <xsl:otherwise><xsl:value-of select="$month + 1"
/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="new-day" select="$new-day -
$days-in-month" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="format-number($year, '0000')" />
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="format-number($month, '00')" />
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="format-number($new-day, '00')" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file