使用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標準庫網站來獲取這些函數功能和參數介紹。