日付を国際形式(UTC)に変換します。 1.0からのXSLTバージョンのテンプレート xmlファイルの日付をモスクワ時間から国際時間に翻訳する必要がありました。 最初は、Java squeakを挿入することで問題は解決しましたが、XSLT 1.0の組み込み機能のみを使用してそれを行う必要がありました。
私はすぐにコメンターに警告します。Dateデータ型があるXSLTバージョン2.0は良くありません。1.0で実装する必要があります。
サンプル、テンプレート、結果、およびパーサーをここからダウンロードします。
したがって、問題を解決する手順:
形式の元の日付をコンポーネントに分割します。 冬/夏時間への切り替えを考慮して、UTCに対するタイムゾーンオフセットを決定します。夏のモスクワでは、オフセットは-4で、冬-3ではオフセットです。 夏時間は、3月の最終日曜日の午前2時に変更され、10月の最終日曜日の午前3時に冬時間に切り替わります。 UTC時間での日付のすべての部分の翻訳 UTC形式の日付コレクション。
サブタスク:
曜日検索、Zellerの式が使用されます 月の日数を検索する うるう年検定
元の日付テンプレート:
DD.MM.YYYY hh:mm:ss
XSLを問題なくフォーマットに合わせて調整できます。切断シーケンスを変更し、区切り文字を指定するだけです。
UTC日付形式:
YYYY-MM-DD hh:mm:ss
最終的な文字列を収集するときにさらに簡単に修正されました。
他のタイムゾーンオフセットが必要な場合は、MoscowOffsetTime関数でそれらを修正するだけです。
テンプレートの使用:
<xsl:call-template name= "GetTime" >
<xsl:with-param name= "time" select = "10.15.2010 14:10:17" ></xsl:with-param>
</xsl:call-template>
* This source code was highlighted with Source Code Highlighter .
実際には、テンプレートコード自体:
<xsl:template name= "GetTime" >
<xsl:param name= "time" ></xsl:param>
<xsl:call-template name= "MoscowDataToUTC" >
<xsl:with-param name= "data" select = "$time" ></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name= "MoscowDataToUTC" >
<xsl:param name= "data" />
<xsl:variable name= "vData" >
<xsl:call-template name= "splitEqFirst" >
<xsl:with-param name= "str" select = "$data" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "' '" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vDataDD" >
<xsl:call-template name= "splitEqFirst" >
<xsl:with-param name= "str" select = "$vData" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "'.'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vDataBuf" >
<xsl:call-template name= "splitEqSecond" >
<xsl:with-param name= "str" select = "$vData" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "'.'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vDataMM" >
<xsl:call-template name= "splitEqFirst" >
<xsl:with-param name= "str" select = "$vDataBuf" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "'.'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vDataYYYY" >
<xsl:call-template name= "splitEqSecond" >
<xsl:with-param name= "str" select = "$vDataBuf" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "'.'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vTime" >
<xsl:call-template name= "splitEqSecond" >
<xsl:with-param name= "str" select = "$data" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "' '" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vTimeHH" >
<xsl:call-template name= "splitEqFirst" >
<xsl:with-param name= "str" select = "$vTime" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "':'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vTimeBuf" >
<xsl:call-template name= "splitEqSecond" >
<xsl:with-param name= "str" select = "$vTime" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "':'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vTimeMM" >
<xsl:call-template name= "splitEqFirst" >
<xsl:with-param name= "str" select = "$vTimeBuf" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "':'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vTimeSS" >
<xsl:call-template name= "splitEqSecond" >
<xsl:with-param name= "str" select = "$vTimeBuf" ></xsl:with-param>
<xsl:with-param name= "worddiv" select = "':'" />
</xsl:call-template>
</xsl:variable>
<!-- -->
<xsl:variable name= "deltaTime" >
<xsl:call-template name= "MoscowOffsetTime" >
<xsl:with-param name= "day" select = "$vDataDD" ></xsl:with-param>
<xsl:with-param name= "hh" select = "$vTimeHH" ></xsl:with-param>
<xsl:with-param name= "month" select = "$vDataMM" ></xsl:with-param>
<xsl:with-param name= "year" select = "$vDataYYYY" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- UTC -->
<!-- , , 1-->
<xsl:variable name= "vDataYYYYUTC" >
<xsl:call-template name= "MoscowYearToUTCYear" >
<xsl:with-param name= "hh" select = "$vTimeHH" ></xsl:with-param>
<xsl:with-param name= "day" select = "$vDataDD" ></xsl:with-param>
<xsl:with-param name= "month" select = "$vDataMM" ></xsl:with-param>
<xsl:with-param name= "year" select = "$vDataYYYY" ></xsl:with-param>
<xsl:with-param name= "delta" select = "$deltaTime" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- , , -->
<xsl:variable name= "vDataMMUTC" >
<xsl:call-template name= "MoscowMonthToUTCMonth" >
<xsl:with-param name= "hh" select = "$vTimeHH" ></xsl:with-param>
<xsl:with-param name= "day" select = "$vDataDD" ></xsl:with-param>
<xsl:with-param name= "month" select = "$vDataMM" ></xsl:with-param>
<xsl:with-param name= "delta" select = "$deltaTime" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- , , -->
<xsl:variable name= "vDataDDUTC" >
<xsl:call-template name= "MoscowDayToUTCDay" >
<xsl:with-param name= "hh" select = "$vTimeHH" ></xsl:with-param>
<xsl:with-param name= "day" select = "$vDataDD" ></xsl:with-param>
<xsl:with-param name= "month" select = "$vDataMM" ></xsl:with-param>
<xsl:with-param name= "year" select = "$vDataYYYY" ></xsl:with-param>
<xsl:with-param name= "delta" select = "$deltaTime" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- , delta, , 20-->
<xsl:variable name= "vTimeHHUTC" >
<xsl:call-template name= "MoscowHoutToUTCHour" >
<xsl:with-param name= "hh" select = "$vTimeHH" ></xsl:with-param>
<xsl:with-param name= "hl" select = "$deltaTime" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- , 0 -->
<xsl:variable name= "vTimeHHOUT" >
<xsl:call-template name= "ZeroBeforeOneNumber" >
<xsl:with-param name= "num" select = "$vTimeHHUTC" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vDateDDOUT" >
<xsl:call-template name= "ZeroBeforeOneNumber" >
<xsl:with-param name= "num" select = "$vDataDDUTC" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name= "vDataMMOUT" >
<xsl:call-template name= "ZeroBeforeOneNumber" >
<xsl:with-param name= "num" select = "$vDataMMUTC" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- UTC -->
<xsl: value -of select = "$vDataYYYYUTC" />-<xsl: value -of select = "$vDataMMOUT" />-<xsl: value -of select = "$vDateDDOUT" /><xsl: value -of select = "' '" /><xsl: value -of select = "$vTimeHHOUT" />:<xsl: value -of select = "$vTimeMM" />:<xsl: value -of select = "$vTimeSS" />
</xsl:template>
<!-- -->
<xsl:template name= "ZeroBeforeOneNumber" >
<xsl:param name= "num" ></xsl:param>
<xsl:choose>
<xsl:when test= "number($num) < 10" >0<xsl: value -of select = "$num" /></xsl:when>
<xsl:otherwise><xsl: value -of select = "$num" /></xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- -->
<xsl:template name= "MoscowYearToUTCYear" >
<xsl:param name= "hh" ></xsl:param>
<xsl:param name= "day" ></xsl:param>
<xsl:param name= "month" ></xsl:param>
<xsl:param name= "year" ></xsl:param>
<xsl:param name= "delta" ></xsl:param>
<xsl:choose>
<xsl:when test= "(number($hh) + $delta) < 0 and ($day = '01') and ($month='01')" >
<xsl: value -of select = "number($year)-number(1)" />
</xsl:when>
<xsl:otherwise>
<xsl: value -of select = "number($year)" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- -->
<xsl:template name= "MoscowMonthToUTCMonth" >
<xsl:param name= "hh" ></xsl:param>
<xsl:param name= "day" ></xsl:param>
<xsl:param name= "month" ></xsl:param>
<xsl:param name= "delta" ></xsl:param>
<xsl:choose>
<xsl:when test= "(number($hh) + $delta) < 0 and ($day = '01')" >
<xsl:choose>
<xsl:when test= "number($month) = 1" >12</xsl:when>
<xsl:otherwise><xsl: value -of select = "number($month)-number(1)" /></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl: value -of select = "number($month)" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- -->
<xsl:template name= "MoscowDayToUTCDay" >
<xsl:param name= "hh" ></xsl:param>
<xsl:param name= "day" ></xsl:param>
<xsl:param name= "month" ></xsl:param>
<xsl:param name= "year" ></xsl:param>
<xsl:param name= "delta" ></xsl:param>
<xsl:choose>
<xsl:when test= "(number($hh) + $delta) < 0" >
<xsl:choose>
<xsl:when test= "number($day) = 1" >
<xsl:call-template name= "CountDaysInMonth" >
<xsl:with-param name= "month" select = "number($month)-1" ></xsl:with-param>
<xsl:with-param name= "year" select = "$year" ></xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise><xsl: value -of select = "number($day)-number(1)" /></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise><xsl: value -of select = "$day" /></xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- -->
<xsl:template name= "CountDaysInMonth" >
<xsl:param name= "month" ></xsl:param>
<xsl:param name= "year" ></xsl:param>
<xsl:choose>
<xsl:when test= "($month = 1) or ($month = 3) or ($month = 5) or ($month = 7) or ($month = 8) or ($month = 10) or ($month = 12) or ($month = 0)" >31</xsl:when>
<xsl:when test= "($month = 4) or ($month = 6) or ($month = 9) or ($month = 11)" >30</xsl:when>
<xsl:when test= "($month = 2)" >
<!--. -->
<xsl:choose>
<xsl:when test= "(number($year) mod 4 = 0) and (number($year) mod 100 != 0 or number($year) mod 400 = 0)" >29</xsl:when>
<xsl:otherwise>28</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>30</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- -->
<xsl:template name= "MoscowHoutToUTCHour" >
<xsl:param name= "hh" />
<xsl:param name= "hl" />
<xsl:variable name= "t" select = "(number($hh)+number($hl))" ></xsl:variable>
<xsl:choose>
<xsl:when test= "number($t) < 0" >
<xsl: value -of select = "number($t)+24" />
</xsl:when>
<xsl:when test= "number($t) > 23" >
<xsl: value -of select = "number($t)-24" />
</xsl:when>
<xsl:otherwise>
<xsl: value -of select = "number($t)" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- / -->
<xsl:template name= "MoscowOffsetTime" >
<xsl:param name= "hh" ></xsl:param>
<xsl:param name= "day" ></xsl:param>
<xsl:param name= "month" ></xsl:param>
<xsl:param name= "year" ></xsl:param>
<!-- -->
<xsl:variable name= "dayOfWeek" >
<xsl:call-template name= "DayOfWeek" >
<xsl:with-param name= "day" select = "$day" ></xsl:with-param>
<xsl:with-param name= "month" select = "$month" ></xsl:with-param>
<xsl:with-param name= "year" select = "$year" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- -->
<xsl:variable name= "countDayOfMonth" >
<xsl:call-template name= "CountDaysInMonth" >
<xsl:with-param name= "month" select = "$month" ></xsl:with-param>
<xsl:with-param name= "year" select = "$year" ></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<!-- -->
<xsl:variable name= "diffDay" select = "number($countDayOfMonth)-number($day)" />
<!-- -->
<xsl:variable name= "offsetToSun" select = "6-number($dayOfWeek)" />
<!-- -->
<xsl:choose>
<xsl:when test= "number($month) > 3 and number($month) < 10" >-4</xsl:when>
<!-- 7 -->
<xsl:when test= "number($month) = 3 and $diffDay > 7" >
-3
</xsl:when>
<xsl:when test= "number($month) = 10 and $diffDay > 7" >
-4
</xsl:when>
<!-- 7 -->
<xsl:when test= "number($month) = 3 and $offsetToSun > $diffDay " >
-4
</xsl:when>
<xsl:when test= "number($month) = 10 and $offsetToSun > $diffDay " >
-3
</xsl:when>
<!-- -->
<xsl:when test= "number($month) = 3 and ($offsetToSun = 0) and ($diffDay < 7)" >
<xsl:choose>
<xsl:when test= "$hh >= 2" >-4</xsl:when>
<xsl:otherwise>-3</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test= "number($month) = 10 and ($offsetToSun = 0) and ($diffDay < 7)" >
<xsl:choose>
<xsl:when test= "$hh >= 3" >-3</xsl:when>
<xsl:otherwise>-4</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>-3</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- ( )-->
<xsl:template name= "DayOfWeek" >
<xsl:param name= "day" ></xsl:param>
<xsl:param name= "month" ></xsl:param>
<xsl:param name= "year" ></xsl:param>
<xsl:variable name= "gMonth" >
<xsl:choose>
<xsl:when test= "number($month) = 1" >
<xsl: value -of select = "number(13)" />
</xsl:when>
<xsl:when test= "number($month) = 2" >
<xsl: value -of select = "number(14)" />
</xsl:when>
<xsl:otherwise>
<xsl: value -of select = "number($month)" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name= "Y" select = "number($year) mod 100" ></xsl:variable>
<xsl:variable name= "Ydiv4" select = "floor($Y div 4)" />
<xsl:variable name= "M26div10" select = "floor(((number($gMonth)+1)*26) div 10)" />
<xsl:variable name= "C" select = "floor($year div 100)" />
<xsl:variable name= "Cdiv4" select = "floor($C div 4)" />
<xsl:variable name= "F" >
<xsl: value -of select = "(number($day)+number($M26div10)+$Y+number($Ydiv4)+number($Cdiv4)+5*$C) mod 7" ></xsl: value -of>
</xsl:variable>
<!-- , =0, ..., =5, =6-->
<xsl:choose>
<xsl:when test= "$F=0" >5</xsl:when>
<xsl:when test= "$F=1" >6</xsl:when>
<xsl:otherwise>
<xsl: value -of select = "number($F)-2" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- -->
<xsl:template name= "tokenEq" >
<xsl:param name= "token" />
<xsl: value -of select = "$token" />
</xsl:template>
<xsl:template name= "splitEqFirst" match= "text()" mode= "splitEqFirst" >
<xsl:param name= "str" select = "." />
<xsl:param name= "worddiv" select = "' '" />
<xsl: if test= "contains($str,$worddiv)" >
<xsl:call-template name= "tokenEq" >
<xsl:with-param name= "token" select = "substring-before($str, $worddiv)" />
</xsl:call-template>
</xsl: if >
</xsl:template>
<xsl:template name= "splitEqSecond" match= "text()" mode= "splitEqSecond" >
<xsl:param name= "str" select = "." />
<xsl:param name= "worddiv" select = "' '" />
<xsl: if test= "contains($str,$worddiv)" >
<xsl:call-template name= "tokenEq" >
<xsl:with-param name= "token" select = "substring-after($str, $worddiv)" />
</xsl:call-template>
</xsl: if >
</xsl:template>
<!--————————————————————————————————————————————————-->
* This source code was highlighted with Source Code Highlighter .
All Articles