<?xml version="1.0" encoding="UTF-8"?> | |
<!-- | |
Licensed to the Apache Software Foundation (ASF) under one or more | |
contributor license agreements. See the NOTICE file distributed with | |
this work for additional information regarding copyright ownership. | |
The ASF licenses this file to You under the Apache License, Version 2.0 | |
(the "License"); you may not use this file except in compliance with | |
the License. You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
--> | |
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |
<xsl:template name="isDateString"> | |
<xsl:param name="string"/> | |
<xsl:if test="string-length($string) = 10 and contains($string,'-') and contains(substring-after($string,'-'),'-')">1</xsl:if> | |
</xsl:template> | |
<!-- removing the hyphens and colons seems to be wrong for XSD dateTime that requires it --> | |
<!-- extract the year part from date/datetime string --> | |
<xsl:template name="getDate"> | |
<xsl:param name="string"/> | |
<xsl:variable name="datePart"> | |
<xsl:choose> | |
<xsl:when test="contains($string,'T')"> | |
<xsl:value-of select="substring-before($string,'T')"/> | |
</xsl:when> | |
<xsl:when test="(string-length($string)= 10 and contains($string,'-')) or string-length($string)=8"> | |
<xsl:value-of select="$string"/> | |
</xsl:when> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:if test="string-length($datePart)"> | |
<xsl:call-template name="formatXSDDate"> | |
<xsl:with-param name="string" select="$datePart"/> | |
</xsl:call-template> | |
</xsl:if> | |
</xsl:template> | |
<xsl:template name="getTime"> | |
<xsl:param name="string"/> | |
<xsl:variable name="timePart"> | |
<xsl:choose> | |
<xsl:when test="contains($string,'T')"> | |
<xsl:value-of select="substring-after($string,'T')"/> | |
</xsl:when> | |
<!-- test that - does not occur twice (first might be from TZ) --> | |
<xsl:when test="not(contains($string,'-') and contains(substring-after($string,'-'),'-'))"> | |
<xsl:value-of select="$string"/> | |
</xsl:when> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:if test="string-length($timePart)"> | |
<xsl:call-template name="formatXSDTime"> | |
<xsl:with-param name="string" select="$timePart"/> | |
</xsl:call-template> | |
</xsl:if> | |
</xsl:template> | |
<xsl:template name="formatXSDDate"> | |
<xsl:param name="string"/> | |
<xsl:choose> | |
<xsl:when test="contains($string,'-')"> | |
<!-- assume the string is already in right format --> | |
<xsl:value-of select="$string"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<!-- assume only the hyphens are missing --> | |
<xsl:variable name="year" select="substring($string,1,4)"/> | |
<xsl:variable name="month" select="substring($string,5,2)"/> | |
<xsl:variable name="day" select="substring($string,7,2)"/> | |
<xsl:value-of select="concat($year,'-',$month,'-',$day)"/> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template name="formatXSDTime"> | |
<xsl:param name="string"/> | |
<xsl:choose> | |
<xsl:when test="contains($string,':')"> | |
<xsl:value-of select="$string"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:variable name="tz"> | |
<xsl:choose> | |
<xsl:when test="contains($string,'Z')">Z</xsl:when> | |
<xsl:when test="contains($string,'+')"> | |
<xsl:value-of select="concat('+',substring-after($string,'+'))"/> | |
</xsl:when> | |
<xsl:when test="contains($string,'-')"> | |
<xsl:value-of select="concat('-',substring-after($string,'-'))"/> | |
</xsl:when> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:variable name="tzFormatted"> | |
<xsl:choose> | |
<xsl:when test="$tz = 'Z'"> | |
<xsl:value-of select="$tz"/> | |
</xsl:when> | |
<xsl:when test="string-length($tz)"> | |
<xsl:value-of select="concat(substring($tz,1,3),':00')"/> | |
</xsl:when> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:variable name="timePart"> | |
<xsl:choose> | |
<xsl:when test="string-length($tz)"> | |
<xsl:value-of select="substring-before($string,$tz)"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="$string"/> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:variable name="hour" select="substring($timePart,1,2)"/> | |
<xsl:variable name="minute" select="substring($timePart,3,2)"/> | |
<xsl:variable name="second"> | |
<xsl:choose> | |
<xsl:when test="string-length($timePart) > 4"> | |
<xsl:value-of select="substring($timePart,5,2)"/> | |
</xsl:when> | |
<xsl:otherwise>00</xsl:otherwise> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:value-of select="concat($hour,':',$minute,':',$second,$tzFormatted)"/> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template name="buildUTC"> | |
<xsl:param name="dt"/> | |
<xsl:choose> | |
<xsl:when test="contains($dt,'Z') or not(contains($dt,'T')) or string-length($dt) < 20"> | |
<xsl:value-of select="$dt"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:variable name="year" select="number(substring($dt,1,4))"/> | |
<xsl:variable name="month" select="number(substring($dt,6,2))"/> | |
<xsl:variable name="day" select="number(substring($dt,9,2))"/> | |
<xsl:variable name="hour" select="number(substring($dt,12,2))"/> | |
<xsl:variable name="tz"> | |
<xsl:choose> | |
<xsl:when test="substring($dt,20,1) = '+'"> | |
<xsl:value-of select="number(substring($dt,21,2))"></xsl:value-of> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="number(substring($dt,20,3))"/> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:variable name="dayOffset"> | |
<xsl:choose> | |
<xsl:when test="($hour - $tz) > 24"><xsl:value-of select="1"/></xsl:when> | |
<xsl:when test="($hour - $tz) < 0"><xsl:value-of select="-1"/></xsl:when> | |
<xsl:otherwise><xsl:value-of select="0"/></xsl:otherwise> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:variable name="hour2"> | |
<xsl:value-of select="$hour - $tz - (24*$dayOffset)"/> | |
</xsl:variable> | |
<xsl:choose> | |
<xsl:when test="$dayOffset"> | |
<!-- compute new day --> | |
<xsl:variable name="maxDays"> | |
<xsl:call-template name="monthLength"> | |
<xsl:with-param name="m" select="$month"/> | |
<xsl:with-param name="y" select="$year"/> | |
</xsl:call-template> | |
</xsl:variable> | |
<xsl:variable name="monthOffset"> | |
<xsl:choose> | |
<xsl:when test="$day+$dayOffset > $maxDays"><xsl:value-of select="1"/></xsl:when> | |
<xsl:when test="$day+$dayOffset < 1"><xsl:value-of select="-1"/></xsl:when> | |
<xsl:otherwise><xsl:value-of select="0"/></xsl:otherwise> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:variable name="day2"> | |
<xsl:choose> | |
<xsl:when test="$monthOffset = -1"> | |
<xsl:call-template name="monthLength"> | |
<xsl:with-param name="m" select="$month - 1"/> | |
<xsl:with-param name="y" select="$year"/> | |
</xsl:call-template> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="$day + $dayOffset - ($maxDays * $monthOffset)"/> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:choose> | |
<xsl:when test="$monthOffset"> | |
<!-- compute new month/year --> | |
<xsl:variable name="yearOffset"> | |
<xsl:choose> | |
<xsl:when test="$month+$monthOffset > 12"><xsl:value-of select="1"/></xsl:when> | |
<xsl:when test="$month+$monthOffset < 1"><xsl:value-of select="-1"/></xsl:when> | |
<xsl:otherwise><xsl:value-of select="0"/></xsl:otherwise> | |
</xsl:choose> | |
</xsl:variable> | |
<xsl:variable name="month2" select="$month + $monthOffset - (12 * $yearOffset)"/> | |
<xsl:variable name="year2" select="$year + $yearOffset"/> | |
<xsl:value-of select="concat(format-number($year2,'0000'),'-',format-number($month2,'00'), | |
'-',format-number($day2,'00'),'T',format-number($hour2,'00'),substring($dt,14,6),'Z')"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="concat(substring($dt,1,8),format-number($day2,'00'),'T',format-number($hour2,'00'),substring($dt,14,6),'Z')"/> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="concat(substring($dt,1,11),format-number($hour2,'00'),substring($dt,14,6),'Z')"/> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template name="monthLength"> | |
<xsl:param name="m"/> | |
<xsl:param name="y"/> | |
<xsl:choose> | |
<xsl:when test='$m = 4 or $m = 6 or $m = 9 or $m = 11'> | |
<xsl:value-of select="30" /> | |
</xsl:when> | |
<xsl:when test='$m = 2'> | |
<xsl:choose> | |
<xsl:when test="(($y mod 4) = 0 and ($y mod 100) != 0) or ($y mod 400) = 0"> | |
<xsl:value-of select="29"/> | |
</xsl:when> | |
<xsl:otherwise><xsl:value-of select="28" /></xsl:otherwise> | |
</xsl:choose> | |
<xsl:value-of select="28" /> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="31" /> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
</xsl:stylesheet> |