【问题标题】:date minus another date in xslt日期减去 xslt 中的另一个日期
【发布时间】:2014-03-03 22:36:41
【问题描述】:

希望有人可以提供帮助。我正在尝试比较 XML 文件中的 2 个日期并使用 XSLT 进行一些计算:

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

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

谁能解释一下?

【问题讨论】:

  • 您可以选择 XSLT 2.0 吗?
  • 我如何知道 XSLT 2.0 在我的服务器上是否可用?
  • 找出您正在使用的 XSLT 引擎,并验证它的功能。检查当前环境中是否支持 XSLT 2.0 的最快/最简单的方法是尝试执行 2.0 样式表,就像我发布的那样,它利用了 2.0 功能。 1.0 处理器将无法成功运行它,并且会抛出有关不受支持的 XSLT/XPath 2.0 函数的错误。

标签: xslt


【解决方案1】:

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

【讨论】:

  • 我如何知道XSLT2.0是否可以被我使用?
【解决方案2】:

EXSLT - date:difference 解决方案可能值得一看。我相信这应该可以满足您的需求,甚至可以使用直接的 XSLT 实现。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 2019-03-19
      • 2013-08-12
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多