使用XSLT标准库中的日期函数
日期名称(Day name)
day name函数可以让我们指定一个日期并返回该日期的名称(比如星期一、星期二之类)。这可以使你的XML文档更加规范,便于阅读。
Listing A 是我们将要在本文中用到的XML文档例子。Listing B 说明了day name函数在XSL stylesheet中的用法。
Listing A:
mydoc.xml
<?xml version="1.0" ?>
<MyDoc>
<SomeDate>
<Year>2003</Year>
<Month>1</Month>
<Day>1</Day>
</SomeDate>
<SomeTime>
<Hour>12</Hour>
<Minute>30</Minute>
<Second>00</Second>
<TZ>-05:00</TZ>
</SomeTime>
</MyDoc>
Listing B:
getday.xsl
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl=http://www.w3.org/1999/XSL/Transform
xmlns:dt="http://xsltsl.org/date-time">
<xsl:import href="http://xsltsl.sourceforge.net/modules/stdlib.xsl"/>
<xsl:template match="/">
<MyDoc>
<xsl:variable name="dow">
<xsl:call-template name="dt:calculate-day-of-the-week">
<xsl:with-param name="year" select="MyDoc/SomeDate/Year"/>
<xsl:with-param name="month" select="MyDoc/SomeDate/Month"/>
<xsl:with-param name="day" select="MyDoc/SomeDate/Day"/>
</xsl:call-template>
</xsl:variable>
<DayOfWeek>
<xsl:value-of select="$dow" />
</DayOfWeek>
<NameOfDay type="long">
<xsl:call-template name="dt:get-day-of-the-week-name">
<xsl:with-param name="day-of-the-week" select="$dow"/>
</xsl:call-template>
</NameOfDay>
<NameOfDay type="abbreviated">
<xsl:call-template name="dt:get-day-of-the-week-abbreviation">
<xsl:with-param name="day-of-the-week" select="$dow"/>
</xsl:call-template>
</NameOfDay>
</MyDoc>
</xsl:template>
</xsl:stylesheet>
这段代码显示了XSLT中三种不同的日期模板。首先,我们希望显示日期的名字,然而模板返回的值只有一个,就是当天是一周中的第几天。这个函数库给我们提供了计算每周日子的模板(calculate-day-of-the-week)。
我们用这个模板来计算指定的日期到底是一周中的哪一天,将这个值存入XSL的变量,然后使用查找该日期名字的模板(get-day-of-the-week-name)得到实际的日期,在这个例子中,这个最终结果是星期三。
在Listing C 中我们会实现显示星期缩写的模板(get-day-of-the-week-abbreviation)
Listing C:
gotday.xml
<?xml version="1.0" encoding="UTF-8"?>
<MyDoc xmlns:dt="http://xsltsl.org/date-time">
<DayOfWeek>3</DayOfWeek>
<NameOfDay type="long">Wednesday</NameOfDay>
<NameOfDay type="abbreviated">Wed</NameOfDay>
</MyDoc>
日期和时间格式
XSLT标准库中最有用的函数就是日期和时间格式函数了。这个函数允许你随心所欲的修改日期和时间显示格式。它有几个输入参数,比如日期、年份、月份以及时间变量。它还有一个格式参数用来指定输出日期和时间的格式。
Listing D 显示了一个XSL stylesheet使用格式函数的例子。在这个例子中,我们没有指定特殊格式,这表示模板会按默认格式显示。
Listing D: mydoc.xsl
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl=http://www.w3.org/1999/XSL/Transform
xmlns:dt="http://xsltsl.org/date-time">
<xsl:import href="http://xsltsl.sourceforge.net/modules/stdlib.xsl"/>
<xsl:template match="/">
<MyDoc>
<NewDateTime>
<xsl:call-template name="dt:format-date-time">
<xsl:with-param name="year" select="MyDoc/SomeDate/Year"/>
<xsl:with-param name="month" select="MyDoc/SomeDate/Month"/>
<xsl:with-param name="day" select="MyDoc/SomeDate/Day"/>
<xsl:with-param name="hour" select="MyDoc/SomeTime/Hour"/>
<xsl:with-param name="minute" select="MyDoc/SomeTime/Minute"/>
<xsl:with-param name="second" select="MyDoc/SomeTime/Second"/>
<xsl:with-param name="time-zone" select="MyDoc/SomeTime/TZ"/>
</xsl:call-template>
</NewDateTime>
</MyDoc>
</xsl:template>
</xsl:stylesheet>
Listing E显示了stylesheet的输出结果:
Listing E: mynewdoc.xml
<?xml version="1.0" encoding="UTF-8"?>
<MyDoc xmlns:dt="http://xsltsl.org/date-time">
<NewDateTime>2003-01-01T12:30:00</NewDateTime>
</MyDoc>
我们可以通过定制格式参数来定制我们自己的格式。在格式参数中有很多可以制定的参数。比如你可以指定本地时间格式或者任意排列日期时间部分。关于参数设置的所有文档都在网上都可以访问到。
假设我们需要按以下格式显示日期时间:
Wednesday January 01, 2003
我们需要如下方法来使用format-date-time 模板:
<xsl:call-template name="dt:format-date-time">
<xsl:with-param name="year"
select="MyDoc/SomeDate/Year"/>
<xsl:with-param name="month"
select="MyDoc/SomeDate/Month"/>
<xsl:with-param name="day"
select="MyDoc/SomeDate/Day"/>
<xsl:with-param name="hour"
select="MyDoc/SomeTime/Hour"/>
<xsl:with-param name="minute"
select="MyDoc/SomeTime/Minute"/>
<xsl:with-param name="second"
select="MyDoc/SomeTime/Second"/>
<xsl:with-param name="time-zon"
select="MyDoc/SomeTime/TZ"/>
<xsl:with-param name="format" select="'%A %B %d,
%Y'"/>
</xsl:call-template>
在这个例子里,%A表示星期的全名,%B表示月份的全名,%d表示该日期是一个月中的第几天,%Y表示年份(四位数)。
更多选项
XSLT标准库能够大大增强你的XSL stylesheets功能。在XSLT 标准库中还有另外一部分日期函数,不过大部分需要通过format-date-time函数实现。你可以通过访问XSLT标准库网站来获取这些函数功能和参数介绍。