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

XSLT 2.0/3.0实现节假日XML数据中缺失日期条目的插入

XSLT补全节假日缺失日期解决方案

用XSLT 2.0及以上版本内置的日期运算函数即可高效实现需求,无需手动处理月份天数、闰年等边界逻辑。

核心实现思路

  • 先将输入XML中所有DATE节点值转换为标准xs:date类型,提取出整个日期范围的最小日期、最大日期
  • 利用日期累加特性生成从最小到最大日期的完整逐日序列,XSLT内置的日期运算会自动处理跨月、闰年、大小月等逻辑
  • 对每个生成的日期,匹配输入中是否存在对应条目:存在则复用原有条目,不存在则生成默认工作日条目(FREEDAY留空)

完整XSLT代码示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    
    <!-- 按日期建立现有条目映射,提升查找效率 -->
    <xsl:key name="dateItem" match="item" use="DATE"/>
    
    <xsl:template match="/HOLIDAYS">
        <HOLIDAYS>
            <!-- 提取现有数据的日期范围 -->
            <xsl:variable name="allDates" select="for $d in item/DATE return xs:date($d)"/>
            <xsl:variable name="startDate" select="min($allDates)"/>
            <xsl:variable name="endDate" select="max($allDates)"/>
            
            <!-- 逐天遍历生成完整条目 -->
            <xsl:for-each select="0 to days-from-duration($endDate - $startDate)">
                <xsl:variable name="currentDate" select="$startDate + xs:dayTimeDuration(concat('P', ., 'D'))"/>
                <xsl:variable name="currentDateStr" select="string($currentDate)"/>
                <xsl:choose>
                    <xsl:when test="key('dateItem', $currentDateStr)">
                        <!-- 复用已有条目 -->
                        <xsl:copy-of select="key('dateItem', $currentDateStr)"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <!-- 生成默认工作日条目 -->
                        <item>
                            <DATE><xsl:value-of select="$currentDateStr"/></DATE>
                            <FREEDAY/>
                            <HOLIDAY/>
                            <HOLIDAY_ID/>
                            <TXT_SHORT/>
                            <TXT_LONG/>
                        </item>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </HOLIDAYS>
    </xsl:template>
</xsl:stylesheet>

补充说明

  1. 你给出的输出示例中存在嵌套的<item>标签属于输入手误,上述代码生成的所有<item>均为平级结构,符合标准XML规范
  2. 如果需要补全整个自然年的日期,直接修改$startDate和$endDate的取值为当年1月1日、12月31日即可
  3. 该方案时间复杂度为O(n),n为需要生成的总天数,执行效率远高于手动处理月份逻辑的方案
  4. 如果受环境限制只能使用XSLT 1.0,需要额外引入第三方日期运算模板实现天数累加,逻辑复杂度会高很多,优先推荐使用XSLT 2.0及以上版本实现该需求

内容的提问来源于stack exchange,提问作者Ravi Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:45:02