2011-05-13 52 views
3

希望有人可以提供幫助。我試圖比較XML文件中的2個日期,並使用XSLT進行一些計算:date在xslt中減去另一個日期

例如,我在XML中有2個日期:2011-05-23和2011-04-29。我想要做的計算裏面XSLT象下面這樣:

( '2011-05-23' - '2011-04-29')* 30 = 24 * 30 = 720

誰能有何啓示?

+1

XSLT 2.0是您的選擇嗎? – 2011-05-13 20:39:04

+0

我如何知道XSLT 2.0是否可用在我的服務器上? – user752611 2011-05-16 12:45:42

+1

找出您正在使用的XSLT引擎,並驗證其功能。檢查當前環境中是否支持XSLT 2.0的最快/最簡單的方法是嘗試執行2.0版樣式表,如我發佈的樣式表,該樣式表利用2.0功能。 1.0處理器將無法成功運行它,並會拋出關於不受支持的XSLT/XPath 2.0函數的錯誤。 – 2011-05-16 16:35:14

回答

1

這可能值得看看EXSLT - date:difference解決方案。我相信應該做你想做的事情,甚至還有一個可用的XSLT實現。

請注意,雖然返回的值是按照XML Schema Part 2: Datatypes Second Edition中指定的持續時間格式,所以很可能您需要處理結果以推導出您希望用於計算的單位(例如,在上面的示例中,預計結果詳細說明天數的差異 - 所以你需要將你想要的相關單位取出來,結果從日期:差異很可能是「P24D」)。

1

這裏有兩個模板我有時使用日期計算:

<xsl:template name="calcseconds"> 
    <xsl:param name="date" /> 
    <xsl:value-of select="(((substring($date,1,4) - 1970) * 365)+floor((substring($date,1,4) - 1970) div 4)+substring('000,031,059,090,120,151,181,212,243,273,304,334,365',substring($date,6,2)*4-3,3)+(substring($date,9,2)-1)+(1-floor(((substring($date,1,4) mod 4) + 2) div 3))*floor((substring($date,6,2)+17) div 20))*86400+(substring($date,12,2)*3600)+(substring($date,15,2)*60)+substring($date,18,2)" /> 
</xsl:template> 

<xsl:template name="calcdays"> 
    <xsl:param name="date" /> 
    <xsl:value-of select="(((substring($date,1,4) - 1970) * 365)+floor((substring($date,1,4) - 1970) div 4)+substring('000,031,059,090,120,151,181,212,243,273,304,334,365',substring($date,6,2)*4-3,3)+(substring($date,9,2)-1)+(1-floor(((substring($date,1,4) mod 4) + 2) div 3))*floor((substring($date,6,2)+17) div 20))" /> 
</xsl:template> 

他們有點拗口,但他們會計算秒/天數自午夜1日1970年1月爲一個整數,然後你可以直接進行算術運算。他們依賴的日期格式爲yyyy-mm-dd hh:mm:ss,但對子串調用參數的操縱應允許您以任何您需要的格式處理日期。

2

的XSLT 2.0溶液

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:template match="/"> 
<xsl:value-of select="days-from-duration(
             xs:date('2011-05-23') 
             - xs:date(xs:date('2011-04-29')) 
        )*30"/> 
</xsl:template> 
</xsl:stylesheet> 

收率:720

  • xs:date()函數計算的日期,其可用於執行日期操作
  • 從第一減去第二日期得到xdt:dayTimeDurationP24D(24天)
  • days-from-duration()xdt:dayTimeDuration(24)
  • 中提取天組分,然後您可以使用該數字執行正常的漫反射(例如, 24*30=720
+0

如果XSLT 2.0可用於解決您的問題,則爲+1。 – 2011-05-15 09:26:07

+0

如果XSLT2.0可以被我使用,我該如何處理? – user752611 2011-05-16 12:46:03