использование xslt, как я тестирую, если дата была в последнем (говорит) 15 дней?
вход:
вывод:
например, недавний ('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?
Вот один из способов сделать это в 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 <= 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
Это преобразование:
<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.