c3d2-web/xsl/date.xsl

451 lines
16 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
exclude-result-prefixes="xsl">
<!--xsl:template name="isleap">
<xsl:param name="year" />
<xsl:value-of select="$year mod 4 = 0 and ($year mod 100 != 0 or $year mod 400 = 0)" />
</xsl:template>
<xsl:template name="leapdays">
<- Berechnet die Schalttage, die bis $year seit 1970 vergangen sind ->
<xsl:param name="year" />
<xsl:variable name="four">
<xsl:value-of select="floor($year div 4)" />
</xsl:variable>
<xsl:variable name="hundred">
<xsl:value-of select="floor($year div 100)" />
</xsl:variable>
<xsl:variable name="fourhundred">
<xsl:value-of select="floor($year div 400)" />
</xsl:variable>
<xsl:value-of select="$four - $hundred + $fourhundred - 477" />
</xsl:template>
<xsl:template name="correct-seconds">
<- Berechnet die Sekunden die vergangen wären, wenn es keine Schaltjahre gäbe ->
<xsl:param name="seconds" />
<xsl:variable name="yearguessed">
<xsl:value-of select="floor($seconds div (86400 * 365)) + 1970" />
</xsl:variable>
<xsl:variable name="leapdays">
<xsl:call-template name="leapdays">
<xsl:with-param name="year" select="$yearguessed" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="secondscorrected">
<xsl:value-of select="$seconds - $leapdays * 86400" />
</xsl:variable>
<xsl:variable name="year">
<xsl:value-of select="floor($secondscorrected div (86400 * 365)) + 1970" />
</xsl:variable>
<xsl:variable name="isleap">
<xsl:call-template name="isleap">
<xsl:with-param name="year" select="$year" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="days">
<xsl:value-of select="floor(($secondscorrected div 86400) mod 365) + 1" />
</xsl:variable>
<xsl:choose>
<xsl:when test="$isleap">
<xsl:value-of select="$secondscorrected + 86400" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$secondscorrected" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="get-days">
<xsl:param name="seconds" />
<xsl:variable name="secondscorrected">
<xsl:call-template name="correct-seconds">
<xsl:with-param name="seconds" select="$seconds"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="floor(($secondscorrected mod (365 * 86400)) div 86400) + 1" />
</xsl:template>
<xsl:template name="get-year">
<xsl:param name="seconds" />
<xsl:variable name="secondscorrected">
<xsl:call-template name="correct-seconds">
<xsl:with-param name="seconds" select="$seconds"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="1970 + floor($secondscorrected div (86400 * 365))" />
</xsl:template>
<xsl:template name="get-month">
<xsl:param name="seconds" />
<xsl:variable name="year">
<xsl:call-template name="get-year">
<xsl:with-param name="seconds" select="$seconds"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="isleap">
<xsl:call-template name="isleap">
<xsl:with-param name="year" select="$year" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="febdays">
<xsl:choose>
<xsl:when test="$isleap = 'true'">
<xsl:value-of select="29" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="28" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="days">
<xsl:call-template name="get-days">
<xsl:with-param name="seconds" select="$seconds" />
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$days &lt;= 31">
<xsl:value-of select="1" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays">
<xsl:value-of select="2" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31">
<xsl:value-of select="3" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30">
<xsl:value-of select="4" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31">
<xsl:value-of select="5" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30">
<xsl:value-of select="6" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31">
<xsl:value-of select="7" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31">
<xsl:value-of select="8" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30">
<xsl:value-of select="9" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31">
<xsl:value-of select="10" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30">
<xsl:value-of select="11" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31">
<xsl:value-of select="12" />
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="get-dayofmonth">
<xsl:param name="seconds" />
<xsl:variable name="year">
<xsl:call-template name="get-year">
<xsl:with-param name="seconds" select="$seconds"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="isleap">
<xsl:call-template name="isleap">
<xsl:with-param name="year" select="$year" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="febdays">
<xsl:choose>
<xsl:when test="$isleap = 'true'">
<xsl:value-of select="29" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="28" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="days">
<xsl:call-template name="get-days">
<xsl:with-param name="seconds" select="$seconds" />
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$days &lt;= 31">
<xsl:value-of select="$days" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays">
<xsl:value-of select="$days - 31" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31">
<xsl:value-of select="$days - (31 + $febdays)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30">
<xsl:value-of select="$days - (31 + $febdays + 31)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31">
<xsl:value-of select="$days - (31 + $febdays + 31 + 30)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30">
<xsl:value-of select="$days - (31 + $febdays + 31 + 30 + 31)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31">
<xsl:value-of select="$days - (31 + $febdays + 31 + 30 + 31 + 30)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31">
<xsl:value-of select="$days - 31 + $febdays + 31 + 30 + 31 + 30 + 31" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30">
<xsl:value-of select="$days - (31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31">
<xsl:value-of select="$days - (31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30">
<xsl:value-of select="$days - (31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31)" />
</xsl:when>
<xsl:when test="$days &lt;= 31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31">
<xsl:value-of select="$days - (31 + $febdays + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30)" />
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="get-dayofweek">
<- 1 entspricht Montag ->
<xsl:param name="seconds" />
<- 1. Januar 1970 war ein Donnerstag ->
<xsl:value-of select="(floor($seconds div 86400) + 3) mod 7 + 1" />
</xsl:template-->
<xsl:template name="get-dayofweekstring">
<xsl:param name="date" />
<!--xsl:param name="seconds" /-->
<xsl:variable name="dayofweek">
<xsl:value-of select="date:day-in-week($date)"/>
<!--xsl:call-template name="get-dayofweek">
<xsl:with-param name="seconds" select="$seconds" />
</xsl:call-template-->
</xsl:variable>
<xsl:choose>
<xsl:when test="$dayofweek = 2">Montag</xsl:when>
<xsl:when test="$dayofweek = 3">Dienstag</xsl:when>
<xsl:when test="$dayofweek = 4">Mittwoch</xsl:when>
<xsl:when test="$dayofweek = 5">Donnerstag</xsl:when>
<xsl:when test="$dayofweek = 6">Freitag</xsl:when>
<xsl:when test="$dayofweek = 7">Sonnabend</xsl:when>
<xsl:when test="$dayofweek = 1">Sonntag</xsl:when>
</xsl:choose>
</xsl:template>
<!--xsl:template name="get-timestring">
<xsl:param name="seconds" />
<xsl:variable name="hour">
<xsl:value-of select="format-number(floor($seconds mod 86400 div 3600), '00')" />
</xsl:variable>
<xsl:variable name="minute">
<xsl:value-of select="format-number(floor($seconds mod 3600 div 60), '00')" />
</xsl:variable>
<xsl:variable name="second">
<xsl:value-of select="format-number(floor($seconds mod 60), '00')" />
</xsl:variable>
<xsl:value-of select="concat($hour, ':', $minute, ':', $second)" />
</xsl:template-->
<xsl:template name="get-monthstring">
<xsl:param name="date" />
<!--xsl:param name="seconds" /-->
<xsl:variable name="month">
<xsl:value-of select="date:month-in-year($date)"/>
<!--xsl:call-template name="get-month">
<xsl:with-param name="seconds" select="$seconds" />
</xsl:call-template-->
</xsl:variable>
<xsl:choose>
<xsl:when test="$month = 1">Januar</xsl:when>
<xsl:when test="$month = 2">Februar</xsl:when>
<xsl:when test="$month = 3">März</xsl:when>
<xsl:when test="$month = 4">April</xsl:when>
<xsl:when test="$month = 5">Mai</xsl:when>
<xsl:when test="$month = 6">Juni</xsl:when>
<xsl:when test="$month = 7">Juli</xsl:when>
<xsl:when test="$month = 8">August</xsl:when>
<xsl:when test="$month = 9">September</xsl:when>
<xsl:when test="$month = 10">Oktober</xsl:when>
<xsl:when test="$month = 11">November</xsl:when>
<xsl:when test="$month = 12">Dezember</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="get-datestring">
<xsl:param name="date" />
<!-- Dienstag, 24. Mai 2006 um 00:23:05 -->
<xsl:call-template name="get-dayofweekstring">
<xsl:with-param name="date" select="$date"/>
</xsl:call-template>
<xsl:text>, </xsl:text>
<xsl:value-of select="date:day-in-month($date)"/>
<xsl:text>. </xsl:text>
<xsl:call-template name="get-monthstring">
<xsl:with-param name="date" select="$date"/>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:value-of select="date:year($date)"/>
<!-- Uhrzeit optional, im Timestamp einfach alles ab T... weglassen -->
<xsl:if test="date:hour-in-day($date) or date:minute-in-hour($date)">
<xsl:text> um </xsl:text>
<xsl:call-template name="get-timestring">
<xsl:with-param name="date" select="$date"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="get-timestring">
<xsl:param name="date"/>
<xsl:variable name="hour_in_day">
<xsl:if test="string-length(date:hour-in-day($date))=1">0</xsl:if>
<xsl:value-of select="date:hour-in-day($date)"/>
</xsl:variable>
<xsl:variable name="minute_in_hour">
<xsl:if test="string-length(date:minute-in-hour($date))=1">0</xsl:if>
<xsl:value-of select="date:minute-in-hour($date)"/>
</xsl:variable>
<xsl:variable name="second_in_minute">
<xsl:if test="string-length(date:second-in-minute($date))=1">0</xsl:if>
<xsl:value-of select="date:second-in-minute($date)"/>
</xsl:variable>
<xsl:value-of select="$hour_in_day"/>:<xsl:value-of select="$minute_in_hour"/>
<xsl:text> Uhr</xsl:text>
</xsl:template>
<xsl:template name="get-short-datestring">
<xsl:param name="date"/>
<!-- 26.12.2009 -->
<xsl:value-of select="format-number(date:day-in-month($date), '00')"/>
<xsl:text>.</xsl:text>
<xsl:value-of select="format-number(date:month-in-year($date), '00')"/>
<xsl:text>.</xsl:text>
<xsl:value-of select="format-number(date:year($date), '00')"/>
</xsl:template>
<xsl:template name="datespan-to-human">
<xsl:param name="start"/>
<xsl:param name="end"/>
<xsl:variable name="s" select="concat(date:day-in-month($start),'.',date:month-in-year($start),'.',date:year($start))"/>
<xsl:variable name="e" select="concat(date:day-in-month($end),'.',date:month-in-year($end),'.',date:year($end))"/>
<xsl:choose>
<!-- One day only, no span: s.s.ssss -->
<xsl:when test="$s = $e"><xsl:value-of select="$s"/></xsl:when>
<!-- Same year, same month: s.-e.e.eeee. -->
<xsl:when test="(date:month-in-year($start) = date:month-in-year($end)) and (date:year($start) = date:year($end))"><xsl:value-of select="concat(date:day-in-month($start),'.-',$e)"/></xsl:when>
<!-- Same year, different months: s.s.-e.e.eeee -->
<xsl:when test="(date:year($start) = date:year($end))"><xsl:value-of select="concat(date:day-in-month($start),'.',date:month-in-year($start),'.-',$e)"/></xsl:when>
<!-- Across years: s.s.ssss-e.e.eeee -->
<xsl:otherwise><xsl:value-of select="concat($s,'-',$e)"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="date-to-hevent">
<xsl:param name="date"/>
<xsl:variable name="month_in_year">
<xsl:if test="string-length(date:month-in-year($date))=1">0</xsl:if>
<xsl:value-of select="date:month-in-year($date)"/>
</xsl:variable>
<xsl:variable name="day_in_month">
<xsl:if test="string-length(date:day-in-month($date))=1">0</xsl:if>
<xsl:value-of select="date:day-in-month($date)"/>
</xsl:variable>
<xsl:variable name="hour_in_day">
<xsl:if test="string-length(date:hour-in-day($date))=1">0</xsl:if>
<xsl:value-of select="date:hour-in-day($date)"/>
</xsl:variable>
<xsl:variable name="minute_in_hour">
<xsl:if test="string-length(date:minute-in-hour($date))=1">0</xsl:if>
<xsl:value-of select="date:minute-in-hour($date)"/>
</xsl:variable>
<xsl:variable name="second_in_minute">
<xsl:if test="string-length(date:second-in-minute($date))=1">0</xsl:if>
<xsl:value-of select="date:second-in-minute($date)"/>
</xsl:variable>
<xsl:value-of select="date:year($date)"/><xsl:value-of select="$month_in_year"/><xsl:value-of select="$day_in_month"/><xsl:if test="date:hour-in-day($date)">T<xsl:value-of select="$hour_in_day"/><xsl:value-of select="$minute_in_hour"/><xsl:value-of select="$second_in_minute"/></xsl:if>
</xsl:template>
<!-- Geklaut von:
http://www.trachtenberg.com/blog/2005/03/03/xslt-cookbook-generating-an-rfc-822-date/
TODO: Zeitzone stimmt sicher nicht...
-->
<xsl:template name="date-to-rfc822">
<xsl:param name="date"/>
<xsl:value-of select="concat(date:day-abbreviation($date), ', ',
format-number(date:day-in-month($date), '00'), ' ',
date:month-abbreviation($date), ' ', date:year($date), ' ',
format-number(date:hour-in-day($date), '00'), ':',
format-number(date:minute-in-hour($date), '00'), ':',
format-number(date:second-in-minute($date), '00'), ' GMT')"/>
</xsl:template>
<xsl:template name="strip-time-from-date">
<xsl:param name="date"/>
<xsl:choose>
<xsl:when test="contains($date,'T')"><xsl:value-of select="substring-before($date,'T')"/></xsl:when>
<xsl:otherwise test="contains($date,'T')"><xsl:value-of select="$date"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>