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

如何使用XSLT 1将指定日期增加1天?

在XSLT 1.0中给日期加1天的解决方案

因为XSLT 1.0没有内置的日期处理函数,我们需要手动处理日期的边界情况(月底、年底、闰年2月)。利用你提供的XML节点中已有的Day/Month/Year属性来计算会比解析文本内容更可靠。

核心思路

  1. 提取年、月、日的数值
  2. 判断当前月份的最大天数(需考虑闰年2月的特殊情况)
  3. 根据不同情况计算加1天后的日期:
    • 若当前日+1 ≤ 当月最大天数:直接日+1
    • 若当前日是当月最后一天:月+1,日设为1;如果是12月,则年+1,月设为1,日设为1

完整XSLT代码示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- 判断是否为闰年 -->
    <xsl:template name="is-leap-year">
        <xsl:param name="year"/>
        <xsl:choose>
            <xsl:when test="$year mod 400 = 0">true</xsl:when>
            <xsl:when test="$year mod 100 = 0">false</xsl:when>
            <xsl:when test="$year mod 4 = 0">true</xsl:when>
            <xsl:otherwise>false</xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- 获取当月的最大天数 -->
    <xsl:template name="get-max-day">
        <xsl:param name="month"/>
        <xsl:param name="year"/>
        <xsl:choose>
            <!-- 30天的月份 -->
            <xsl:when test="$month = 4 or $month = 6 or $month = 9 or $month = 11">30</xsl:when>
            <!-- 2月:闰年29天,平年28天 -->
            <xsl:when test="$month = 2">
                <xsl:call-template name="is-leap-year">
                    <xsl:with-param name="year" select="$year"/>
                </xsl:call-template>
                <xsl:choose>
                    <xsl:when test="current() = 'true'">29</xsl:when>
                    <xsl:otherwise>28</xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <!-- 其余月份31天 -->
            <xsl:otherwise>31</xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- 处理日期加1天的主模板 -->
    <xsl:template match="Date">
        <xsl:variable name="current-day" select="@Day"/>
        <xsl:variable name="current-month" select="@Month"/>
        <xsl:variable name="current-year" select="@Year"/>
        
        <xsl:variable name="max-day">
            <xsl:call-template name="get-max-day">
                <xsl:with-param name="month" select="$current-month"/>
                <xsl:with-param name="year" select="$current-year"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:choose>
            <!-- 普通情况:日+1不超过当月最大天数 -->
            <xsl:when test="$current-day + 1 &lt;= $max-day">
                <Date>
                    <!-- 保留原属性,更新日期相关属性和文本内容 -->
                    <xsl:copy-of select="@*"/>
                    <xsl:attribute name="Day"><xsl:value-of select="$current-day + 1"/></xsl:attribute>
                    <!-- 若需更新DayShort/DayFull,需额外添加星期计算逻辑,此处暂忽略 -->
                    <xsl:value-of select="concat(format-number($current-day + 1, '00'), '/', format-number($current-month, '00'), '/', $current-year)"/>
                </Date>
            </xsl:when>
            <!-- 月底情况:日重置为1,月+1 -->
            <xsl:when test="$current-month &lt; 12">
                <Date>
                    <xsl:copy-of select="@*"/>
                    <xsl:attribute name="Day">1</xsl:attribute>
                    <xsl:attribute name="Month"><xsl:value-of select="$current-month + 1"/></xsl:attribute>
                    <!-- 若需更新MonthShort/MonthFull/DayShort/DayFull,需额外添加对应逻辑 -->
                    <xsl:value-of select="concat('01/', format-number($current-month + 1, '00'), '/', $current-year)"/>
                </Date>
            </xsl:when>
            <!-- 年底情况:日重置为1,月重置为1,年+1 -->
            <xsl:otherwise>
                <Date>
                    <xsl:copy-of select="@*"/>
                    <xsl:attribute name="Day">1</xsl:attribute>
                    <xsl:attribute name="Month">1</xsl:attribute>
                    <xsl:attribute name="Year"><xsl:value-of select="$current-year + 1"/></xsl:attribute>
                    <xsl:value-of select="concat('01/01/', $current-year + 1)"/>
                </Date>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

关键点说明

  • 闰年判断:通过is-leap-year模板实现标准闰年规则,确保2月天数计算准确。
  • 当月最大天数:get-max-day模板根据月份和年份返回对应天数,覆盖所有月份的特殊情况。
  • 属性保留:使用<xsl:copy-of select="@*"/>保留原节点的非日期属性,仅更新日期相关的属性和文本内容。
  • 格式统一:用format-number确保日、月始终为两位数(如1号显示为01),保持日期格式一致。

如果需要更新DayShort/DayFull/MonthShort/MonthFull这些文本属性,需额外添加星期、月份名称的映射逻辑——XSLT 1.0没有内置的日期转文本名称的函数。


内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:50:40