日期减去xslt中的另一个日期

日期减去xslt中的另一个日期,xslt,Xslt,希望有人能帮忙。我试图比较XML文件中的两个日期,并使用XSLT进行一些计算: 例如,我有两个XML日期:2011-05-23和2011-04-29。我想在XSLT内部进行如下计算: ('2011-05-23'-'2011-04-29')*30=24*30=720 有人能解释一下吗?这个解决方案可能值得一看。我相信这应该是您想要的,甚至有一个直接的XSLT实现可用 请注意,返回的值是中指定的持续时间格式,因此您可能需要处理结果以导出希望在计算中使用的单位(例如,在上面的示例中,您希望得到一个详细

希望有人能帮忙。我试图比较XML文件中的两个日期,并使用XSLT进行一些计算:

例如,我有两个XML日期:2011-05-23和2011-04-29。我想在XSLT内部进行如下计算:

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


有人能解释一下吗?

这个解决方案可能值得一看。我相信这应该是您想要的,甚至有一个直接的XSLT实现可用


请注意,返回的值是中指定的持续时间格式,因此您可能需要处理结果以导出希望在计算中使用的单位(例如,在上面的示例中,您希望得到一个详细说明天数差异的结果-因此您需要提取您想要使用的相关单元,从日期开始的结果:在这种情况下,差异很可能是“P24D”)。

以下是我有时用于日期计算的两个模板:

<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
,但对子字符串调用参数的操作应允许您以任何格式处理日期您需要。

一个XSLT2.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()
  • 然后,您可以使用该数字执行正常的算术运算(例如,
    24*30=720

XSLT 2.0是否适合您?我如何知道我的服务器上是否有XSLT 2.0?找出您使用的XSLT引擎,并验证其功能。检查当前环境中是否支持XSLT 2.0的最快/最简单的方法是尝试执行一个2.0样式表,如我发布的样式表,该样式表利用了2.0功能。a1.0处理器将无法成功运行它,并将抛出有关不受支持的XSLT/XPath 2.0函数的错误。我如何知道XSLT2.0是否可以由我使用?