【问题标题】:Finding the difference between 2 dates in xslt在 xslt 中查找 2 个日期之间的差异
【发布时间】:2011-07-29 12:31:34
【问题描述】:

在 xslt 中查找 2 个日期之间的天数差异是否有一种不那么笨拙的方法?如果是这样,你能指出我正确的方向。我收到格式为 mm/dd/yyyy 的日期。

【问题讨论】:

  • 您是坚持使用 XSLT 1 还是可以使用 XSLT2?
  • 在 XSLT 1.0 中有 EXSLT date:difference 由 Jeni Tennison 在exslt.org/date/functions/difference/… 实现
  • 我建议为此使用 XSLT 2.0/XPath 2.0。

标签: xslt xslt-2.0 xpath-2.0


【解决方案1】:

XSLT 1.0 的一个更好(更短)的替代方法是计算等效的儒略日期并减去它们。

模板:

<xsl:template name="calculate-julian-day">
    <xsl:param name="year"/>
    <xsl:param name="month"/>
    <xsl:param name="day"/>

    <xsl:variable name="a" select="floor((14 - $month) div 12)"/>
    <xsl:variable name="y" select="$year + 4800 - $a"/>
    <xsl:variable name="m" select="$month + 12 * $a - 3"/>

    <xsl:value-of select="$day + floor((153 * $m + 2) div 5) + $y * 365 + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045"/>

用法:

<xsl:variable name="dateInv" select="'20120406'" />
<xsl:call-template name="calculate-julian-day">
    <xsl:with-param name="year" select="substring($date,1,4)"/>
    <xsl:with-param name="month" select="substring($date,5,2)"/>
    <xsl:with-param name="day" select="substring($date,7,2)"/>
</xsl:call-template>

重复第二个日期,您将得到两个整数。然后,简单地减去它们。

【讨论】:

    【解决方案2】:

    这可以使用以下表达式轻松完成:

    days-from-duration(xs:date('yyyy-MM-dd')-xs:date('yyyy-MM-dd'))
    

    例如:

    days-from-duration(xs:date('2012-06-30')-xs:date('2012-06-18')) 
    

    将给出 12

    的结果

    【讨论】:

      【解决方案3】:

      为此使用 XSLT 2.0 (XPath 2.0)

      <xsl:stylesheet version="2.0"
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          xmlns:my="my:my">
          <xsl:output omit-xml-declaration="yes" indent="yes"/>
      
       <xsl:template match="/">
           <xsl:variable name="vDate1"
              select="my:dateFromUsDate(/*/d1)"/>
           <xsl:variable name="vDate2"
              select="my:dateFromUsDate(/*/d2)"/>
      
         <xsl:sequence select=
         "($vDate1 - $vDate2) div xs:dayTimeDuration('P1D')"/>
       </xsl:template>
      
       <xsl:function name="my:dateFromUsDate" as="xs:date">
        <xsl:param name="pUsDate" as="xs:string"/>
      
        <xsl:sequence select=
        "xs:date(concat(substring($pUsDate,7,4),
                        '-',
                        substring($pUsDate,1,2),
                        '-',
                        substring($pUsDate,4,2)
                       )
                )
        "/>
       </xsl:function>
      </xsl:stylesheet>
      

      当此转换应用于以下 XML 文档时:

      <t>
       <d1>04/06/2011</d1>
       <d2>01/11/2010</d2>
      </t>
      

      产生想要的、正确的结果(相差 450 天)

      450
      

      【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      相关资源
      最近更新 更多