使用xslt如何测试日期是否在最后(比方说)15天内?
输入:
输出:
例如,如果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>
但这并没有考虑到闰年等......当然还有更好的方法吗?
答案 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 <= 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
的返回值