2013-05-10 74 views
4

如何在XSLT中將日期格式從DD-MMM-YYYY轉換爲YYYY-MM-DD。在xslt中將日期從DD-MMM-YYYY轉換爲YYYYMMDD格式1.0

10-JAN-2013 20130110

在XSLT 1.0

+0

XSLT的1.0或2.0 – 2013-05-10 14:12:26

+0

我們需要在XSLT 1.0 – sum 2013-05-10 14:16:47

+0

我認爲最好的辦法是與幾個選擇提取與子的部分和轉換MMM /時 – 2013-05-10 14:19:03

回答

8

這是非常簡單的與xsl:choose元素,並且不需要任何擴展名。

樣式表

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/root"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="date"> 
    <xsl:copy> 
     <xsl:call-template name="date"> 
     <xsl:with-param name="dd-mmm-yyyy" select="."/> 
     </xsl:call-template> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template name="date"> 
    <xsl:param name="dd-mmm-yyyy"/> 
    <xsl:variable name="dd" select="substring-before($dd-mmm-yyyy, '-')"/> 
    <xsl:variable name="mmm-yyyy" select="substring-after($dd-mmm-yyyy, '-')"/> 
    <xsl:variable name="mmm" select="substring-before($mmm-yyyy, '-')"/> 
    <xsl:variable name="yyyy" select="substring-after($mmm-yyyy, '-')"/> 
    <xsl:value-of select="$yyyy"/> 
    <xsl:choose> 
     <xsl:when test="$mmm = 'JAN'">01</xsl:when> 
     <xsl:when test="$mmm = 'FEB'">02</xsl:when> 
     <xsl:when test="$mmm = 'MAR'">03</xsl:when> 
     <xsl:when test="$mmm = 'APR'">04</xsl:when> 
     <xsl:when test="$mmm = 'MAY'">05</xsl:when> 
     <xsl:when test="$mmm = 'JUN'">06</xsl:when> 
     <xsl:when test="$mmm = 'JUL'">07</xsl:when> 
     <xsl:when test="$mmm = 'AUG'">08</xsl:when> 
     <xsl:when test="$mmm = 'SEP'">09</xsl:when> 
     <xsl:when test="$mmm = 'OCT'">10</xsl:when> 
     <xsl:when test="$mmm = 'NOV'">11</xsl:when> 
     <xsl:when test="$mmm = 'DEC'">12</xsl:when> 
    </xsl:choose> 
    <xsl:value-of select="$dd"/> 
    </xsl:template> 

</xsl:stylesheet> 

應用於此XML數據

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <date>10-JAN-2013</date> 
    <date>04-JUL-1776</date> 
    <date>31-DEC-1999</date> 
</root> 

可生產本輸出

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <date>20130110</date> 
    <date>17760704</date> 
    <date>19991231</date> 
</root> 
1

如果能用節點集爲擴展您的XSLT 1.0處理器,可以試試這個。

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl"> 

<xsl:output method="xml" indent="yes" /> 

<xsl:variable name="date" select="'10-JAN-2013'" /> 

<xsl:variable name="month_data_tmp"> 
    <month short="JAN" nr="01" /> 
    <!--- and so on for each month --> 
</xsl:variable> 
<xsl:variable name="month_data" select="exsl:node-set($month_data_tmp)" /> 


<xsl:template name="format_date" > 
    <xsl:param name ="date" /> 
    <xsl:variable name ="day" select="substring-before($date, '-')" /> 
    <xsl:variable name ="month_and_year" select="substring-after($date, '-')" /> 
    <xsl:variable name ="year" select="substring-after($month_and_year, '-')" /> 
    <xsl:variable name ="month" select="substring-before($month_and_year, '-')" /> 
    <xsl:value-of select="$year"/> 
    <xsl:value-of select="$month_data/month[@short=$month]/@nr"/> 
    <xsl:value-of select="$day"/> 
</xsl:template> 

<xsl:template match="/" > 
    <xsl:call-template name="format_date" > 
     <xsl:with-param name ="date" select="$date"/> 
    </xsl:call-template> 
</xsl:template> 

輸出將是:

20130110 

更新能源部另一個問題命令:

您可以在您以前使用<xsl:value-of select="$date"/>任何地方調用模板。

<result> 
    <xsl:call-template name="format_date" > 
     <xsl:with-param name ="date" select="$date"/> 
    </xsl:call-template> 
</result> 

或者你可以將結果賦給一個新變量並使用它。

<xsl:variable name="newdate"> 
    <xsl:call-template name="format_date" > 
     <xsl:with-param name ="date" select="$date"/> 
    </xsl:call-template> 
</xsl:variable> 

<result> 
    <xsl:value-of select="$newdate"/> 
</result> 
+0

我們如何能考慮到這個輸出變量 – sum 2013-05-10 14:59:36

+0

@總結:看看更新。 – 2013-05-10 15:09:49

0

我意識到這個線程現在已經過時了,但是以爲我會分享我的模板,以防有人想通過複製和粘貼來節省一些時間。 感謝上面的答案,因爲這是基於他們。我的模板只是從dd/MM/yyyy轉換爲yyyy-MM-dd;也從dd/MM/yyyy HH:mm:ss到yyyy-MM-ddTHH:mm:ss。

<!-- 
    Template Name: Date 
    Description: Takes a date in the format dd/MM/yyyy and outputs it in the format yyyy-mm-dd 
       Additionally will take a datetime in the format dd/MM/yyyy HH:mm:ss and output in the format yyyy-MM-ddTHH:mm:ss 
    --> 
    <xsl:template name="date"> 
    <xsl:param name="slashFormattedDate"/> 
    <xsl:param name="hasTime"/> 
    <xsl:variable name="dd" select="substring-before($slashFormattedDate, '/')"/> 
    <xsl:variable name="monthYear" select="substring-after($slashFormattedDate, '/')"/> 
    <xsl:variable name="mm" select="substring-before($monthYear, '/')"/> 
    <xsl:variable name="yyyyTemp" select="substring-after($monthYear, '/')"/> 
    <xsl:variable name="yyyy"> 
     <xsl:choose> 
     <xsl:when test="$hasTime='Y'"> 
      <xsl:value-of select="substring-before($yyyyTemp, ' ')"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$yyyyTemp"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:choose> 
     <xsl:when test="$hasTime='Y'"> 
     <xsl:value-of select="$yyyy"/>-<xsl:value-of select="$mm"/>-<xsl:value-of select="$dd"/>T<xsl:value-of select="substring-after($yyyyTemp, ' ')"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$yyyy"/>-<xsl:value-of select="$mm"/>-<xsl:value-of select="$dd"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
相關問題