在xslt中格式化日期

时间:2013-04-19 18:02:40

标签: xml xslt xslt-1.0

我正在尝试在xslt中格式化某个日期格式。格式如下:

  

2012-7-19

我想将此转换为xslt中的数值以进行排序,以便上述内容变为:

  

20120719

问题是单个月/天的前面没有0。所以我需要以某种方式在单个数字月/日前添加,但不要在有两位数的月/日前添加。有谁知道我怎么能这样做?

到目前为止,我有这个:

<xsl:value-of select="concat(
    substring(substring-after(substring-after(./AirDate, '/'),'/'),0,5),
    substring(substring-after(./AirDate, '/'), 0, 3),
    substring-before(./AirDate, '/'))"/>

但偶尔会出现/个位数天,并且不会在个位数月/日前面加0

我无法在将数据源传递给xslt之前更改数据源,我必须使用xslt 1.0版。

4 个答案:

答案 0 :(得分:7)

我认为格式号可以解决问题。

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

    <xsl:variable name="date" select="'2007-3-19'" />
    <xsl:template name="format_date" >
        <xsl:param name ="date" />
        <xsl:variable name ="year" select="substring-before($date, '-')" />
        <xsl:variable name ="month_and_day" select="substring-after($date, '-')" />
        <xsl:variable name ="day" select="substring-after($month_and_day, '-')" />
        <xsl:variable name ="month" select="substring-before($month_and_day, '-')" />
        <xsl:value-of select="$year"/>
        <xsl:value-of select="format-number($month, '00')"/>
        <xsl:value-of select="format-number($day, '00')"/>
    </xsl:template>

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

答案 1 :(得分:1)

我确信即使使用XSLT 1.0,也有更优雅的方法,但这种相当野蛮的解决方案是一种选择:

样式表

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

  <xsl:variable name="HYPHEN" select="'-'"/>

  <xsl:template name="zero-pad">
    <xsl:param name="number"/>

    <xsl:choose>
      <xsl:when test="string-length($number) = 1">
        <xsl:value-of select="concat('0', $number)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$number"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="format-date">
    <xsl:param name="date"/>

    <xsl:variable name="year" select="substring-before($date, $HYPHEN)"/>
    <xsl:variable name="month-and-day"
      select="substring-after($date, concat($year, $HYPHEN))"/>

    <xsl:variable name="month">
      <xsl:call-template name="zero-pad">
        <xsl:with-param name="number"
          select="substring-before($month-and-day, $HYPHEN)"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="day">
      <xsl:call-template name="zero-pad">
        <xsl:with-param name="number"
          select="substring-after($month-and-day, $HYPHEN)"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:value-of select="number(concat($year, $month, $day))"/>
  </xsl:template>

  <xsl:template match="/">
    <xsl:call-template name="format-date">
      <xsl:with-param name="date" select="'2012-7-19'"/>
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>

输出

20120719

答案 2 :(得分:0)

您可以使用substring-aftersubstring-before的组合来提取片段,然后将它们作为数字而不是字符串处理 - 即使用乘法和加法来生成最终值。

这样的事情:

<xsl:variable name="sep" select="'-'"/>
<xsl:variable name="date" select="."/>
<xsl:value-of select="substring-after(substring-after($date, $sep),$sep) + substring-before(substring-after($date, $sep),$sep)*100 + substring-before($date, $sep)*10000"/>

sepdate变量分别设置为要使用的分隔符和原始日期字符串(在您的问题中,示例使用-作为分隔符,但XSLT使用{{ 1}})

答案 3 :(得分:-1)

试试这个:

<xsl:value-of select="concat(substring(date, 7, 4), '-', substring(date, 4, 2), '-', substring(date, 1, 2))"/>