在xslt 1.0中将日期从DD-MMM-YYYY转换为YYYYMMDD格式

时间:2013-05-10 14:08:53

标签: xslt

我们如何在XSLT中将日期格式从DD-MMM-YYY转换为YYYY-MM-DD。

2013年1月10日至20130110

在XSLT 1.0中

3 个答案:

答案 0 :(得分:9)

使用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 :(得分:1)

如果您可以使用 node-set 作为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

将doe更新为命令中的其他问题:

您可以在之前使用<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>

答案 2 :(得分:1)

我意识到这个帖子现在已经过时了,但我想我会分享我的模板以防有人想通过复制和粘贴来节省一些时间。&#xA;感谢上面的答案,因为这是基于他们。我的模板只是从dd / MM / yyyy转换为yyyy-MM-dd;还有来自dd / MM / yyyy HH:mm:ss到yyyy-MM-ddTHH:mm:ss。

&#xA;&#xA;
 &lt;! - &#xA ;模板名称:日期&#xA;描述:采用dd / MM / yyyy格式的日期,并以yyyy-mm-dd&#xA格式输出;另外,将采用dd / MM / yyyy HH:mm:ss格式的日期时间,格式为yyyy-MM-ddTHH:mm:ss&#xA; - &GT;&#XA; &lt; xsl:template name =“date”&gt;&#xA; &lt; xsl:param name =“slashFormattedDate”/&gt;&#xA; &lt; xsl:param name =“hasTime”/&gt;&#xA; &lt; xsl:variable name =“dd”select =“substring-before($ slashFormattedDate,'/')”/&gt;&#xA; &lt; xsl:variable name =“monthYear”select =“substring-after($ slashFormattedDate,'/')”/&gt;&#xA; &lt; xsl:variable name =“mm”select =“substring-before($ monthYear,'/')”/&gt;&#xA; &lt; xsl:variable name =“yyyyTemp”select =“substring-after($ monthYear,'/')”/&gt;&#xA; &lt; xsl:variable name =“yyyy”&gt;&#xA; &LT; XSL:选择&GT;&#XA; &lt; xsl:when test =“$ hasTime ='Y'”&gt;&#xA; &lt; xsl:value-of select =“substring-before($ yyyyTemp,'')”/&gt;&#xA; &LT; / XSL:当&GT;&#XA; &LT; XSL:否则&GT;&#XA; &lt; xsl:value-of select =“$ yyyyTemp”/&gt;&#xA; &LT; / XSL:否则&GT;&#XA; &LT; / XSL:选择&GT;&#XA; &LT; / XSL:可变&GT;&#XA; &LT; XSL:选择&GT;&#XA; &lt; xsl:when test =“$ hasTime ='Y'”&gt;&#xA; &lt; xsl:value-of select =“$ yyyy”/&gt;  - &lt; xsl:value-of select =“$ mm”/&gt;  - &lt; xsl:value-of select =“$ dd”/&gt; T&lt; xsl:value-of select =“substring-after($ yyyyTemp,'')”/&gt;&#xA; &LT; / XSL:当&GT;&#XA; &LT; XSL:否则&GT;&#XA; &lt; xsl:value-of select =“$ yyyy”/&gt;  - &lt; xsl:value-of select =“$ mm”/&gt;  - &lt; xsl:value-of select =“$ dd”/&gt; &#XA; &LT; / XSL:否则&GT;&#XA; &LT; / XSL:选择&GT;&#XA; &LT; / XSL:模板&GT;&#XA;  
&#XA;