2010-07-21 6 views
1

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

вход:

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

выход:

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

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

несколько шагов я получил:

главная функ

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

+0

xls - это расширение для электронных таблиц Excel. Я думаю, вы имеете в виду XSLT, и вы должны отредактировать свой пост и теги, чтобы исправить это. –

+0

Кроме того, вы должны опубликовать некоторый пример ввода и ожидаемый вывод вместе с кодом XSL, который вы пробовали. SO - это не место, где люди творят (дома) для вас. –

+0

была добавлена ​​наивная попытка ... хорошее место на xls vs xsl. – GreyCloud

ответ

1

Вот один из способов сделать это в 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> 

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

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

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

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

+0

Отлично работает (после модификаций), хотя его позор, что .net ! оленья кожа поддержка XLST 2.0 Модификации, чтобы заставить его работать - в C# позволяет выполнять скрипты: http://msdn.microsoft.com/en-us/library/ms163499.aspx на код - завернуть все в msxsl: сценарий с также заменить < на < благодаря :) – GreyCloud

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.

+0

Pants. Net 4.0, похоже, не реализует XSLT 2.0: * (любой способ заставить это работать в версии 1.0? – GreyCloud

+0

@GreyCloud: тогда вы можете использовать Если вы использовали процессор XSLT 1.0, который реализует EXSLT (например, Saxon 6.x), вы можете взглянуть на модуль даты и времени XSLT. –