XSLT-将Date从任何格式转换为特定格式

时间:2019-01-24 04:43:51

标签: xml xslt

我在XML文件中的字段中有一个日期值:

<xsl:value-of select="nightlyRate/@date" />

我想将其转换为给定格式:

<xsl:param name="dateformat" select="yyyy/mm/dd">

如何在XSL转换中做到这一点?

2 个答案:

答案 0 :(得分:0)

除非您有一些聪明的方法知道1920年3月4日是3月4日还是4月3日,否则问题就不可能解决。

在开始使用XSLT或任何其他语言编写代码之前,您需要明确说明代码应该做什么。

答案 1 :(得分:0)

XSLT 1.0 中,没有功能(如 @ michael.hor257k 所述)以特定格式转换日期。

您可以根据自己的环境通过以下两种方式专门实现它:

1。。如果您使用的是Java,则可以使用 java.util.TimeZone java.util.Calendar API编写Util类。

在util类中定义最终的静态常量,并使用这些API将值解析为所需的日期格式。

2。。假设您具有如下所示的输入源:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
    <nightlyRate date="20180312" />
</Root>

然后将要转换的xslt使用简单的substring()函数:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">

<xsl:output indent="yes" />
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <date>
        <xsl:call-template name="getFormattedDate">
            <xsl:with-param name="date" select="Root/nightlyRate/@date" />
        </xsl:call-template>
    </date>
</xsl:template>

<xsl:template name="getFormattedDate">
    <xsl:param name="date" />
    <xsl:value-of select="concat(substring($date,1,4),'/',substring($date,5,2),'/',substring($date,7,2))" />
</xsl:template>

XSLT 2.0 中,

采用相同的输入源,可以这样编写:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
version="2.0">

<xsl:output omit-xml-declaration="yes" />

<xsl:template match="/">
    <xsl:variable name="dateString">
        <xsl:value-of select="substring(Root/nightlyRate/@date,1,4)" />
        <xsl:text>-</xsl:text>
        <xsl:value-of select="substring(Root/nightlyRate/@date,5,2)" />
        <xsl:text>-</xsl:text>
        <xsl:value-of select="substring(Root/nightlyRate/@date,7,2)" />
    </xsl:variable>
    <RequiredFormat>
        <xsl:value-of select="format-date(xs:date($dateString), '[Y]/[M]/[D]')" />
    </RequiredFormat>
    <OtherFormat>
        <xsl:value-of select="format-date(xs:date($dateString), '[MNn] [D], [Y]')" />
    </OtherFormat>
</xsl:template>

输出为:

<RequiredFormat>2018/3/12</RequiredFormat>
<OtherFormat>March 12, 2018</OtherFormat>