希望有人可以提供帮助。我试图比较XML文件中的2个日期并使用XSLT进行一些计算:
例如,我在XML中有两个日期:2011-05-23和2011-04-29。我想在XSLT中进行计算,如下所示:
('2011-05-23' - '2011-04-29')* 30 = 24 * 30 = 720
任何人都可以放弃任何光明吗?
答案 0 :(得分: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:dayTimeDuration
P24D
(24天)days-from-duration()
从xdt:dayTimeDuration
(24)24*30=720
)答案 1 :(得分:1)
可能值得查看EXSLT - date:difference解决方案。我相信应该做你想要的,甚至还有一个直接的XSLT实现。
请注意,返回的值是XML Schema Part 2: Datatypes Second Edition中指定的持续时间格式,因此您可能需要处理结果以派生您希望在计算中使用的单位(例如在您的示例中)以上你期望一个结果详细说明天数差异 - 所以你需要拉出你想要使用的相关单位,结果来自日期:在这种情况下的差异很可能是“P24D”)。
答案 2 :(得分: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>
他们有点拗口,但他们会计算自1970年1月1日午夜以来的秒数/天数作为整数,然后你可以直接算术。它们依赖于yyyy-mm-dd hh:mm:ss
的日期格式,但是对子串调用的参数的操作应该允许您以任何所需的格式处理日期。