我對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在相同的名稱空間中。
我覺得這是非常簡單的事情,因爲所有的教程都顯示了正在使用的函數,但似乎沒有什麼東西可以幫助我。有人能告訴我我錯過了什麼嗎?
更改日期格式,並根據您的建議的XSL後,XMLSpy的工作。但是,Firefox和我的CLI實用程序仍然抱怨該函數不存在。 xsltproc不知道任何函數,儘管我聽說它不支持XSLT 2.Xalan只會報告date-from-dateTime,而不是xs:dateTime()。 爲什麼我需要xs的命名空間,但不是爲了fn? – hufman 2009-09-05 17:01:17
確定 - 據我所知: Xalan僅支持XPath 1.0,這意味着它不知道名爲day-from-dateTime的函數。 確實支持XPath 2的處理器。0具有內置的day-from-dateTime,因此您可以顯式聲明名稱空間前綴和URI,或者僅使用內置的函數名稱。 您需要數據類型的名稱空間前綴,因爲它不內置於與XPath 2.0功能相同。 – Brabster 2009-09-05 17:30:59
除非僅使用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