在XSLT中格式化日期和时间

时间:2014-06-06 19:07:23

标签: xml datetime xslt format

我有一个以默认格式返回日期和时间的列。

<xsl:value-of select="/CAudioFile/CRI/LocalStartTime"/>

返回

  

2014-05-08T08:01:26.4000000-0700

我想把这段时间用在这种格式中:

  

05/08/2014 08:01:26

我试图使用不同的子串组合来获取格式:

<xsl:value-of select="substring(/CAudioFile/CRI/LocalStartTime,1,10)"/>

但要么只是回复我的日期,要么就是时间。

有什么建议吗?

谢谢。

3 个答案:

答案 0 :(得分:4)

你需要更加努力地工作:

<xsl:value-of select="substring(CAudioFile/CRI/LocalStartTime, 6, 2)"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="substring(CAudioFile/CRI/LocalStartTime, 9, 2)"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="substring(CAudioFile/CRI/LocalStartTime, 1, 4)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring(CAudioFile/CRI/LocalStartTime, 12, 8)"/>

答案 1 :(得分:2)

您没有指定XSLT的版本。如果您可以使用2.0,则可以使用format-dateTime()

在你的情况下,这有点棘手,因为你的例子由于时区而不能作为xs:dateTime进行转换。时区需要2位数; 07:00代替0700。您可以使用replace()并转换为xs:dateTime来解决此问题。

这是一个例子。我已将replace()放在xsl:variable中,以便于阅读。但这不是必需的。

XML输入

<test>2014-05-08T08:01:26.4000000-0700</test>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <xsl:variable name="dt" select="xs:dateTime(replace(normalize-space(.),'([+-]\d{2})(\d{2})$','$1:$2'))" as="xs:dateTime"/>
        <xsl:copy>
            <xsl:value-of select="format-dateTime($dt,'[M00]/[D00]/[Y] [H00]:[m00]:[s00]')"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<test>05/08/2014 08:01:26</test>

您可以在此处找到有关图片字符串的更多信息(format-dateTime()的第二个参数):

http://www.w3.org/TR/xslt20/#date-picture-string

答案 2 :(得分:0)

这些变量将为您提供日期(采用ISO 8601格式)和使用XPath 1.0表达式的时间:

<xsl:variable name="date">
    <xsl:value-of select="substring-before(.,'T')"/>
</xsl:variable>
<xsl:variable name="time">
    <xsl:value-of select="substring-before(substring-after(.,'T'),'.')"/>
</xsl:variable>

要将日期转换为 mm / dd / yyyy 格式,您可以将此模板添加到样式表中:

<xsl:template name="iso-to-mdy">
    <xsl:param name="iso-date"/>
    <xsl:variable name="year" select="substring($iso-date,1,4)"/>    
    <xsl:variable name="month" select="substring($iso-date,6,2)"/>
    <xsl:variable name="day" select="substring($iso-date,9,2)"/>
    <xsl:value-of select="$month"/>
    <xsl:text>/</xsl:text>
    <xsl:value-of select="$day"/>
    <xsl:text>/</xsl:text>
    <xsl:value-of select="$year"/>
</xsl:template>

而是声明你的date变量,将ISO 8601日期作为参数传递:

<xsl:variable name="date">
    <xsl:call-template name="iso-to-mdy">
        <xsl:with-param name="iso-date" select="substring-before(.,'T')"/>
    </xsl:call-template>
</xsl:variable>

然后您将获得所需格式的日期。要在时间和日期之间打印空格,您可以使用<xsl:text>

<date>
    <xsl:value-of select="$date"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="$time"/>
</date>

将打印

<date>05/08/2014 08:01:26</date>

参见 XSLT Fiddle