xslt:time before test

时间:2010-07-21 20:17:15

标签: xml datetime xslt xpath

使用xslt如何测试日期是否在最后(比方说)15天内?

输入:

  • 日期格式为dd / mm / yy
  • X天数

输出:

  • 如果日期在现在的X天内发生

例如,如果02/07/10过去30天,则最近('02 / 07/10',30)将返回true

我得到了一些步骤:

主要功能

    <xsl:function name="custom:monthtodays">
    <xsl:param name="date"/>
    <xsl:param name="daysago"/>
    <xsl:variable name="daycountnow" select="year-from-dateTime(current-dateTime())*365+day-from-dateTime(current-dateTime())+custom:monthtodays(month-from-dateTime(current-dateTime())" />
    <xsl:variable name="datedaycount" select="numeric(substring($date,1,2))+numeric(substring($date,7,2))*365+custom:monthtodays(numeric(substring($date,4,2)))" />
    <xsl:value-of select="$daycountnow - $datedaycount - $daysago > 0"/>
</xsl:function>

helper func

 <xsl:function name="custom:monthtodays">
    <xsl:param name="month"/>
    <xsl:choose>
      <xsl:when test="$month =1"> <xsl:value-of select="0"/> </xsl:when>
      <xsl:when test="$month =2"> <xsl:value-of select="31"/> </xsl:when>
      <xsl:when test="$month =3"> <xsl:value-of select="59"/> </xsl:when>
      <xsl:when test="$month =4"> <xsl:value-of select="90"/> </xsl:when>
      <xsl:when test="$month =5"> <xsl:value-of select="120"/> </xsl:when>
      <xsl:when test="$month =6"> <xsl:value-of select="151"/> </xsl:when>
      <xsl:when test="$month =7"> <xsl:value-of select="181"/> </xsl:when>
      <xsl:when test="$month =8"> <xsl:value-of select="212"/> </xsl:when>
      <xsl:when test="$month =9"> <xsl:value-of select="243"/> </xsl:when>
      <xsl:when test="$month =10"> <xsl:value-of select="273"/> </xsl:when>
      <xsl:when test="$month =11"> <xsl:value-of select="304"/> </xsl:when>
      <xsl:when test="$month =12"> <xsl:value-of select="334"/> </xsl:when>
    </xsl:choose>
  </xsl:function>

但这并没有考虑到闰年等......当然还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

此转化

<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 method="text"/>

  <xsl:template match="/">
   <xsl:value-of select="my:isWithinDays(/*, 30)"/>
  </xsl:template>

  <xsl:function name="my:isWithinDays" as="xs:boolean">
   <xsl:param name="pDate" as="xs:string"/>
   <xsl:param name="pDaysDuration" as="xs:integer"/>

    <xsl:variable name="vvalidDate" select=
     "concat('20',
             substring($pDate,7),
             '-',
             substring($pDate,4,2),
             '-',
             substring($pDate,1,2))"/>

     <xsl:sequence select=
      "current-date() - xs:date($vvalidDate) 
      le 
       xs:dayTimeDuration(concat('P',$pDaysDuration, 'D'))"/>
  </xsl:function>
</xsl:stylesheet>

应用于此XML文档时

<t>02/07/10</t>

产生想要的结果

true

应用于此XML文档

<t>20/06/10</t>

再次生成正确的结果

false

注意:此转换于今天21/07/10进行。

答案 1 :(得分:1)

这是在XSLT 1.0中可以实现的一种方法。当您使用.Net 4.0时,您应该可以使用microsoft扩展功能,并编写自己的(javascript)函数来执行日期差异。

这是转型。请注意,JavaScript函数非常粗糙,并假设日期为DD / MM / YY格式:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://mycompany.com/mynamespace"> 

<msxsl:script language="javascript" implements-prefix="user"> 
function datecheck(dateString)  
{ 
    // Get today's date
    var today = new Date();

    // Clear down any time portion
    today.setHours(0);
    today.setMinutes(0);
    today.setSeconds(0);
    today.setMilliseconds(0);

    // Length of day in milliseconds
    var one_day = 1000*60*60*24;

    // Convert date string into a date
    var day = parseInt(dateString.substring(0, 2), 10);
    var month = parseInt(dateString.substr(3, 2), 10);
    var year = 2000 + parseInt(dateString.substr(6, 2), 10);
    var date = new Date(year, month - 1, day);

    // Get date difference
    var diff = Math.ceil((today.getTime()-date.getTime()) / one_day);
    return (diff &lt;= 30);
} 
</msxsl:script> 

<xsl:template match="/*"> 
   <xsl:value-of select="user:datecheck(string(.))"/> 
</xsl:template> 

</xsl:stylesheet> 

当您在此输入上应用它时(假设今天是2010年7月23日)

<date>02/07/10</date> 

您应该获得 true

的返回值

在此输入上应用

<date>02/06/10</date> 

您应该获得 false

的返回值