在XSLT中查找2个日期之间的差异

8

有没有一种不那么笨拙的方法在XSLT中找到2个日期之间的天数差?如果有,你能指引我吗?我收到的日期格式为mm/dd/yyyy。


1
你是否被卡在了 XSLT 1 上,还是可以使用 XSLT2? - Jim Garrison
4
在XSLT 1.0中,您可以使用Jeni Tennison在http://www.exslt.org/date/functions/difference/date.difference.template.xsl实现的EXSLT date:difference - user357812
我建议使用XSLT 2.0 / XPath 2.0来完成这个任务。 - Dimitre Novatchev
3个回答

11

在 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>

重复第二个日期操作,你就会得到两个整数。然后,只需将它们相减。


8
这可以通过下列表达式轻松实现:
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


6
请使用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

1
目前唯一能帮助我在OSB上处理日期的解决方案。 - Anatoly Yakimchuk
另一个完美的答案 - https://dev59.com/3Znga4cB1Zd3GeqPWUrm - Sam B
@RudraprasadPradhan,是的,一种方法是按照Buffalo的答案进行操作。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接