3

我正在尝试在 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

4 回答 4

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>
于 2013-04-19T20:32:28.790 回答
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
于 2013-04-19T18:44:30.977 回答
0

您可以使用substring-after和的组合substring-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"/>

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

于 2013-04-19T20:00:02.100 回答
-1

尝试这个:

<xsl:value-of select="concat(substring(date, 7, 4), '-', substring(date, 4, 2), '-', substring(date, 1, 2))"/>
于 2013-04-19T18:09:58.327 回答