我正在尝试在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版。
答案 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-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"/>
将sep
和date
变量分别设置为要使用的分隔符和原始日期字符串(在您的问题中,示例使用-
作为分隔符,但XSLT使用{{ 1}})
答案 3 :(得分:-1)
试试这个:
<xsl:value-of select="concat(substring(date, 7, 4), '-', substring(date, 4, 2), '-', substring(date, 1, 2))"/>