我正在尝试创建一个 xsl 转换,该转换将获取一个日期,向其添加 27 天并检查新日期是否在周末,如果是,它将找到下一个非周末(星期一)并显示它,否则显示它,如果它不在周末。这是否可能,这也需要考虑闰年。
从您的日期开始:
<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,我无法测试此代码,但希望这会让您朝着大方向前进。
在 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
已经提出了各种 XSLT 2.0 解决方案。
在 XSLT 1.0 或 2.0 中,可以使用此处定义的jday
模板来计算输入日期的儒略日数。 增加27;总和是输入日期后 27 天的儒略日数。
对于任何儒略日数 J,确定星期几的最简单方法是计算 J mod 7:如果 J mod 7 = 0,则一天是星期一;如果 J mod 7 是 5 或 6,则一天是星期六或星期日。
要查找下一个星期一,请添加适当的天数,然后使用模板jdate
从儒略日数字转换为日期。