如何在XSLT中将2009-02-07T15:23:00Z转换为Mmm DD, YYYY格式?
解决XSLT中ISO日期转Mmm DD, YYYY格式的问题
我猜你用format-dateTime()没输出,大概率是没传对必填的两个参数——目标日期时间值和格式模式字符串,或者可能用的是不支持这个函数的XSLT 1.0版本。下面分两种情况给你解决方案:
情况1:使用XSLT 2.0及以上版本
format-dateTime是XSLT 2.0引入的函数,需要两个参数:要格式化的日期时间值,以及定义输出格式的字符串。针对你的需求,正确的写法如下:
假设你的ISO日期存在于某个XML节点(比如<eventDate>2009-02-07T15:23:00Z</eventDate>),可以这么写:
<xsl:value-of select="format-dateTime(eventDate, '[MNn,*-3] [D01], [Y0001]')"/>
解释一下格式字符串的含义:
[MNn,*-3]:提取月份的3字符缩写(比如Feb),*-3表示强制取3个字符[D01]:输出两位数字的日期,不足两位补零(比如07)[Y0001]:输出4位完整年份(比如2009)
完整的示例样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:value-of select="format-dateTime(/root/eventDate, '[MNn,*-3] [D01], [Y0001]')"/> </xsl:template> </xsl:stylesheet>
注意:要确保你的XSLT处理器支持2.0+版本(比如Saxon),如果用的是老的Xalan这类只支持1.0的处理器,这个函数会失效。
情况2:使用XSLT 1.0版本
如果只能用XSLT 1.0,因为没有内置的日期格式化函数,我们需要手动截取日期片段并映射月份缩写:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!-- 先获取ISO日期字符串 --> <xsl:variable name="isoDate" select="/root/eventDate"/> <!-- 截取年、月、日部分 --> <xsl:variable name="year" select="substring($isoDate, 1, 4)"/> <xsl:variable name="monthNum" select="substring($isoDate, 6, 2)"/> <xsl:variable name="day" select="substring($isoDate, 9, 2)"/> <!-- 映射月份缩写 --> <xsl:variable name="monthAbbr"> <xsl:choose> <xsl:when test="$monthNum='01'">Jan</xsl:when> <xsl:when test="$monthNum='02'">Feb</xsl:when> <xsl:when test="$monthNum='03'">Mar</xsl:when> <xsl:when test="$monthNum='04'">Apr</xsl:when> <xsl:when test="$monthNum='05'">May</xsl:when> <xsl:when test="$monthNum='06'">Jun</xsl:when> <xsl:when test="$monthNum='07'">Jul</xsl:when> <xsl:when test="$monthNum='08'">Aug</xsl:when> <xsl:when test="$monthNum='09'">Sep</xsl:when> <xsl:when test="$monthNum='10'">Oct</xsl:when> <xsl:when test="$monthNum='11'">Nov</xsl:when> <xsl:when test="$monthNum='12'">Dec</xsl:when> </xsl:choose> </xsl:variable> <!-- 拼接成目标格式 --> <xsl:value-of select="concat($monthAbbr, ' ', $day, ', ', $year)"/> </xsl:template> </xsl:stylesheet>
这样就能把2009-02-07T15:23:00Z转换成Feb 07, 2009啦~
内容的提问来源于stack exchange,提问作者Agniva
相关产品推荐
相关产品推荐

