1

我正在尝试创建一个 xsl 转换,它将接受一个日期,添加 27 天并检查该新日期是否在周末,如果是,它将找到下一个非周末日(星期一)和显示它,否则按原样显示它,如果它不属于周末。这是否可能,这也需要考虑闰年。

4

3 回答 3

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>

'day-of-week' 会给你一个 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,我无法测试这段代码,但希望这会让您朝着大方向前进。

于 2013-09-10T23:54:08.573 回答
0

在 XSLT 2.0 中,使用

test="xs:integer(format-date($date, '[F1]', (), 'ISO', ())) ge 6"

这假设实现支持 ISO 日历,其中弱日从 1=Monday 到 7=Sunday 编号。

或者,也许更好的是,获取自已知星期日以来的天数,并取结果 mod 7:

($date - xs:date('1900-MM-DD')) div xs:dateTimeDuration('P1D') mod 7 ge 5
于 2013-09-11T08:53:57.703 回答
0

已经提出了各种 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将儒略日数转换为日期。

于 2013-09-16T00:17:09.367 回答