You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XSLT 2.0生成两个日期间各月的月末日期

XSLT 2.0 生成两个日期之间所有月末日期的实现方案

需求说明

需要用XSLT 2.0实现逻辑,生成指定开始日期和结束日期之间的所有月末日期。示例如下:

  • 开始日期:2022-10-01(YYYY-MM-dd格式)
  • 结束日期:2023-04-01
  • 期望输出:2022-10-31, 2022-11-30, 2022-12-31, 2023-01-31, 2023-02-28, 2023-03-31, 2023-04-30

已实现日期部分处理,但不清楚如何准确递增月份和年份(如12月后回到1月并递增年份)。

实现方案

在XSLT 2.0中,无需手动判断月份进位逻辑,利用内置日期函数和序列生成就能轻松解决,具体代码如下:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <!-- 可配置的日期参数 -->
    <xsl:param name="start-date" as="xs:date" select="xs:date('2022-10-01')"/>
    <xsl:param name="end-date" as="xs:date" select="xs:date('2023-04-01')"/>

    <xsl:template match="/">
        <!-- 生成覆盖所有目标月份的日期序列 -->
        <xsl:variable name="all-month-ends" as="xs:date*">
            <xsl:for-each select="0 to (year-from-date($end-date) - year-from-date($start-date)) * 12 + (month-from-date($end-date) - month-from-date($start-date))">
                <!-- 计算当前迭代对应的月份起始日期 -->
                <xsl:variable name="current-month-start" select="$start-date + xs:yearMonthDuration(concat('P', ., 'M'))"/>
                <!-- 获取该月的最后一天 -->
                <xsl:sequence select="adjust-date-to-month-end($current-month-start)"/>
            </xsl:for-each>
        </xsl:variable>

        <!-- 输出逗号分隔的结果 -->
        <xsl:value-of select="$all-month-ends" separator=", "/>
    </xsl:template>

</xsl:stylesheet>

核心逻辑解析

  1. 日期类型转换:将输入字符串转为xs:date类型,借助XSLT的内置日期运算自动处理月份进位(比如12月加1个月会自动变成下一年1月)。
  2. 总月数计算:通过年份差乘以12加上月份差,得到从开始到结束的总月数,生成对应循环序列。
  3. 月末日期获取:adjust-date-to-month-end()函数直接返回指定日期所在月份的最后一天,自动适配平闰年2月的不同天数。

运行上述代码即可得到符合要求的月末日期列表。

内容的提问来源于stack exchange,提问作者Aishwarya R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:02:05