xslt: время назад протестируйте

использование xslt, как я тестирую, если дата была в последнем (говорит) 15 дней?

вход:

  • дата в формате дд/мм/гг
  • X количеств дней

вывод:

  • если дата произошла в течение X дней после теперь

например, недавний ('02/07/10', 30) возвратился бы, истинная эквивалентность 07.02.10 составлял 30 дней в прошлом

некоторые шаги я добрался:

основной func

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

помощник 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>

но это не принимает во внимание високосные годы и т.п...., конечно, существует betterway?

1
задан GreyCloud 21 July 2010 в 21:53
поделиться

2 ответа

Вот один из способов сделать это в XSLT 1.0. Поскольку вы используете .Net 4.0, вы должны быть доступны для использования функции расширения microsoft и написать свою собственную функцию (javascript) для изменения даты.

Вот трансформация. Обратите внимание, что функция JavaScript довольно грубая и предполагает, что дата указана в формате ДД / ММ / ГГ:

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

Когда вы применяете ее к этому входу (предполагая, что сегодня 23.07.2010)

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

Вы должны получить возвращаемое значение of true

Когда вы примените его к этому входу

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

, вы должны получить возвращаемое значение false

1
ответ дан 2 September 2019 в 22:51
поделиться

Это преобразование:

<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
ответ дан 2 September 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: