2009-09-05 106 views
5

我對XSLT很陌生,我已經完成了基本的轉換。接下來我想嘗試日期操作,因爲我的數據會有時間戳。但是,我似乎無法獲得任何日期功能,並且令我非常失望。我正在使用Firefox 3.5,xsltproc 1.1.24,xalan 1.10和XMLSpy 2009進行測試,他們都說我嘗試使用的函數不存在。XSLT函數和名稱空間

我的XML看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="datetime.xsl"?> 

<watcher> 
    <event id="1" date="2009-09-04T13:49:10-0500" type="ABCD">This is a test </event> 
</watcher> 
</code> 

我的XSL看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xsl:template match="event[@type='ABCD']"> 
<!--   Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> --> 
<!--   Date: <xsl:value-of select="day-from-dateTime(@date)"/> --> 
       Date: <xsl:value-of select="fn:day-from-dateTime(@date)"/> 
</xsl:template> 

</xsl:stylesheet> 

如果我讓樣式表第2版,XMLSpy的抱怨說,它無法施展我的約會:XSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')

如果我把它作爲版本1,它會抱怨不同的錯誤:XSLT 1.0 Debugging Error: Error in XPath expression (Unknown function - Name and number of arguments do not match any function signature in the static context - 'day-from-dateTime')

無論何時我嘗試將XSL更改爲使用名稱空間(如fn:day-from-dateTime),它都拒絕工作,所有解析器都會說The function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not available及其變體。我從其他測試中知道,我可以完美地使用substring()函數,而不需要任何名稱空間前綴,並且我相信它與day-from-dateTime在相同的名稱空間中。

我覺得這是非常簡單的事情,因爲所有的教程都顯示了正在使用的函數,但似乎沒有什麼東西可以幫助我。有人能告訴我我錯過了什麼嗎?

回答

7

哎呀,討厭的版本事情在這裏。您看到的很多問題都是因爲您使用的XSLT處理器不支持XPath 2.0,而XPath 2.0是date-from-dateTime函數的來源。

我可以得到你想要做的工作,用Saxon processor - Saxon-B 9.1.0.6作爲我的處理器而不是Xalan。 (Xalan的似乎支持的XPath 1.0只,根據documentation

有在文檔中的幾個誤區:

源文件應具有時區爲05:00,而不是0500

<?xml version="1.0" encoding="UTF-8"?> 
<watcher> 
    <event id="1" date="2009-09-04T13:49:10-05:00" type="ABCD">This is a test </event> 
</watcher> 

XSLT應將字符串2009-09-04T13:49:10-05:00轉換爲xs:dateTime,這是date-from-dateTime所需的參數的類型。

Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> 

然後它的工作原理

<?xml version="1.0" encoding="UTF-8"?> 



     Date: 4 

希望幫助,

+0

更改日期格式,並根據您的建議的XSL後,XMLSpy的工作。但是,Firefox和我的CLI實用程序仍然抱怨該函數不存在。 xsltproc不知道任何函數,儘管我聽說它不支持XSLT 2.Xalan只會報告date-from-dateTime,而不是xs:dateTime()。 爲什麼我需要xs的命名空間,但不是爲了fn? – hufman 2009-09-05 17:01:17

+1

確定 - 據我所知: Xalan僅支持XPath 1.0,這意味着它不知道名爲day-from-dateTime的函數。 確實支持XPath 2的處理器。0具有內置的day-from-dateTime,因此您可以顯式聲明名稱空間前綴和URI,或者僅使用內置的函數名稱。 您需要數據類型的名稱空間前綴,因爲它不內置於與XPath 2.0功能相同。 – Brabster 2009-09-05 17:30:59

+2

除非僅使用XPath 2.0支持庫,否則使用XPath 2.0內置函數時會遇到問題。如果您不能獨佔使用XPath 2.0庫,則可以創建一個自定義函數庫,以重新實現所需的日期和時間處理功能。我認爲FunctX可能會在這裏幫助。 http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster 2009-09-05 17:32:51