2012-01-30 4 views
1

どのようxsl dateformatの変換方法は?

2012年1月29日午後12時00分

2012年1月29日(月曜日)

にXSLTで変換するには?

+0

これを確認してください。http://stackoverflow.com/q/500915/616412 –

+2

それはXSLT 1.0または2.0であるかどうかに大きく依存します。 –

答えて

1

出典:http://geekswithblogs.net/workdog/archive/2007/02/08/105858.aspx#110623

は2007年1月20日 『『へ』2007年1月20日午前10時22分28秒PMを「私が変換するように変更しました』 ...それが役に立ついくつか見つけた人を救うために分

<xsl:template name="FormatDate"> 
<!-- expected date format 1/20/2007 10:22:28 PM [OR] 01/20/2007 10:22:28 PM --> 
<xsl:param name="DateTime" /> 
<!-- new date format January 20, 2007 --> 
<xsl:variable name="mo"> 
<xsl:value-of select="substring-before($DateTime,'/')" /> 
</xsl:variable> 
<xsl:variable name="day-temp"> 
<xsl:value-of select="substring-after($DateTime,'/')" /> 
</xsl:variable> 
<xsl:variable name="day"> 
<xsl:value-of select="substring-before($day-temp,'/')" /> 
</xsl:variable> 
<xsl:variable name="year-temp"> 
<xsl:value-of select="substring-after($day-temp,'/')" /> 
</xsl:variable> 
<xsl:variable name="year"> 
<xsl:value-of select="substring($year-temp,1,4)" /> 
</xsl:variable> 

<xsl:choose> 
<xsl:when test="$mo = '1' or $mo = '01'">January</xsl:when> 
<xsl:when test="$mo = '2' or $mo = '02'">February</xsl:when> 
<xsl:when test="$mo = '3' or $mo = '03'">March</xsl:when> 
<xsl:when test="$mo = '4' or $mo = '04'">April</xsl:when> 
<xsl:when test="$mo = '5' or $mo = '05'">May</xsl:when> 
<xsl:when test="$mo = '6' or $mo = '06'">June</xsl:when> 
<xsl:when test="$mo = '7' or $mo = '07'">July</xsl:when> 
<xsl:when test="$mo = '8' or $mo = '08'">August</xsl:when> 
<xsl:when test="$mo = '9' or $mo = '09'">September</xsl:when> 
<xsl:when test="$mo = '10'">October</xsl:when> 
<xsl:when test="$mo = '11'">November</xsl:when> 
<xsl:when test="$mo = '12'">December</xsl:when> 
</xsl:choose> 
<xsl:value-of select="' '"/> 
<xsl:if test="(string-length($day) &lt; 2)"> 
<xsl:value-of select="0"/> 
</xsl:if> 
<xsl:value-of select="$day"/> 
<xsl:value-of select="', '"/> 
<xsl:value-of select="$year"/> 
</xsl:template> 

3

I.アンXSLT 1.0ソリューション他の回答よりもはるかに単純で短く、(曜日を生成していない):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output method="text"/> 

<my:months> 
    <m>Jan</m><m>Feb</m><m>Mar</m><m>Apr</m><m>May</m><m>Jun</m> 
    <m>Jul</m><m>Aug</m><m>Sep</m><m>Oct</m><m>Nov</m><m>Dec</m> 
</my:months> 

<xsl:variable name="vMonthNames" select= 
"document('')/*/my:months/*"/> 

<xsl:template match="text()"> 
    <xsl:variable name="vnumMonth" select="substring-before(., '/')"/> 

    <xsl:variable name="vDay" select= 
    "substring-before(substring-after(., '/'), '/')"/> 

    <xsl:variable name="vYear" select= 
    "substring-before(substring-after(substring-after(., '/'), '/'), ' ')"/> 

    <xsl:value-of select= 
     "concat($vMonthNames[0+$vnumMonth], ' ', 
       $vDay, ', ', 
       $vYear 
      )"/> 
</xsl:template> 
</xsl:stylesheet> 

この変換は、以下のXML文書に適用される:

<t>01/29/2012 00:00</t> 

所望の結果が製造される:

Jan 29, 2012 

II.In XSLT 2.0はあなたのことができる例えば、format-dateTime()のような非常に強力な日時関数。この恐ろしく複雑な解決のために

Sunday, January 29, 2012 
0

謝罪を、それがあげる:この変換は、同じXML文書(上記)に適用され

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="text()"> 
    <xsl:variable name="vComps" select= 
     "tokenize(., '/')"/> 

    <xsl:variable name="vstdDate" select= 
    "concat(substring-before($vComps[3], ' '), '-', 
      $vComps[1], '-', 
      $vComps[2] 
     )"/> 

    <xsl:sequence select= 
     "format-date(xs:date($vstdDate), '[FNn], [MNn] [D], [Y]')"/> 
</xsl:template> 
</xsl:stylesheet> 

は、望んでいた、正しい結果が生産されますあなたは正確に何をXSLT 1.0にしたい:

<xsl:variable name="months" select="'JanFebMarAprMayJunJulAugSepOctDec'" /> 
<xsl:variable name="weekdays" select="'Monday Tuesday WednesdayThursday Friday Saturday Sunday '" /> 

<xsl:template match="date"> 
    <xsl:variable name="days"> 
    <xsl:value-of select=" 
     ((substring(.,7,4) - 1970) * 365)+floor((substring(.,7,4) - 1970) div 4)+ 
     substring('000,031,059,090,120,151,181,212,243,273,304,334,365',substring(.,1,2)*4-3,3)+ 
     (substring(.,4,2)-1)+ 
     (1-floor(((substring(.,7,4) mod 4) + 2) div 3))*floor((substring(.,1,2)+17) div 20) 
    " /> 
    </xsl:variable> 

    <xsl:value-of select="concat(
    normalize-space(substring($weekdays,(($days+3) mod 7) * 9 + 1, 9)), 
    ', ', 
    substring($months,substring(.,1,2) * 3 - 2, 3), 
    ' ', 
    substring(.,4,2) + 0, 
    ', ', 
    substring(.,7,4) 
    )" /> 
</xsl:template> 

変数「日」の建設が決定し、かなり複雑な式を使用しています1970年1月1日以降の日数。そこから3を足すのは簡単なことです(1970年1月1日が木曜日だったので)、substrの変数weekdaysから曜日を取得するには、この数字のmod 7を使用します。

もしあなたが多くの日付で作業するつもりなら、XSLT2を手に入れよう!