我正在尝试创建一个xsl转换,它将占用一个日期,添加27天并检查新的日期是否属于周末,如果是,它将找到下一个非周末日(星期一)并显示它,否则显示它,如果它没有在周末。这是否可能,这也需要考虑到闰年。
答案 0 :(得分:3)
从您的约会开始:
<xsl:variable name="date" select="'2013-09-13T00:40:00'" />
然后,显然,您可以使用:
<xsl:sequence select="$date +27*xs:dayTimeDuration('P1D')"/>
但这仅适用于XSLT 2.0,我没有。
您可以使用以下方法查看一周的哪一天:
<xsl:variable name="day-of-week">
<xsl:call-template name="calculate-day-of-the-week"> <!--0-6, where 0=Sun,1=Mon,2=Tue,3=Wed,4=Thu,5=Fri,6=Sat-->
<xsl:with-param name="date-time" select="$date" />
</xsl:call-template>
</xsl:variable>
<xsl:template name="calculate-day-of-the-week">
<xsl:param name="date-time"/>
<xsl:param name="date" select="substring-before($date-time,'T')"/>
<xsl:param name="year" select="substring-before($date,'-')"/>
<xsl:param name="month" select="substring-before(substring-after($date,'-'),'-')"/>
<xsl:param name="day" select="substring-after(substring-after($date,'-'),'-')"/>
<xsl:variable name="a" select="floor((14 - $month) div 12)"/>
<xsl:variable name="y" select="$year - $a"/>
<xsl:variable name="m" select="$month + 12 * $a - 2"/>
<xsl:value-of select="($day + $y + floor($y div 4) - floor($y div 100) + floor($y div 400) + floor((31 * $m) div 12)) mod 7"/>
</xsl:template>
'星期几'将为您提供0-6(周日至周六)的值。这将占闰年并将在XSLT 1.0中起作用
然后你可以使用:
<xsl:if test="day-of-week=0>
<xsl:sequence select="$date +28*xs:dayTimeDuration('P1D')"/>
</xsl:if>
<xsl:if test="day-of-week=6>
<xsl:sequence select="$date +29*xs:dayTimeDuration('P1D')"/>
</xsl:if>
我不能在没有XSLT 2.0的情况下测试这段代码,但希望这会让你朝着大方向前进。
答案 1 :(得分:0)
在XSLT 2.0中,使用
test="xs:integer(format-date($date, '[F1]', (), 'ISO', ())) ge 6"
这假设实现支持ISO日历,其中弱日期从1 =星期一到7 =星期日编号。
或者,也许更好,获得自已知星期日以来的天数,并取结果mod 7:
($date - xs:date('1900-MM-DD')) div xs:dateTimeDuration('P1D') mod 7 ge 5
答案 2 :(得分:0)
已经提出了各种XSLT 2.0解决方案。
在XSLT 1.0或2.0中,您可以使用jday
模板定义here来计算输入日期的Julian日期编号。加27;总和是输入日期后27天的Julian日数。
对于任何朱利安日数J,确定星期几的最简单方法是计算J mod 7:如果J mod 7 = 0,则该日是星期一;如果J mod 7是5或6,则该日是星期六或星期日。
要查找下周一,请添加适当的天数,然后使用模板jdate
将朱利安日数转换为日期。