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

如何用XSLT 3.0结合XPATH计算两日期间的工作日(排除周末)?

XSLT 3.0 计算两个日期间的工作日数(排除周末)

核心思路

XSLT 3.0原生支持标准日期类型与序列操作,无需依赖1.0的扩展函数。通过以下步骤实现:

  1. 用xs:date()将输入的日期字符串转换为标准日期类型
  2. 生成两个日期之间的完整日期序列
  3. 过滤掉周六(星期值为6)和周日(星期值为7)的日期
  4. 统计剩余工作日的数量

完整代码示例

假设输入XML结构如下:

<root>
    <date1>2023-03-10</date1>
    <date2>2023-03-14</date2>
</root>

对应的XSLT 3.0代码:

<xsl:stylesheet version="3.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                xmlns:fn="http://www.w3.org/2005/xpath-functions">
    
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <!-- 动态从XML中获取日期(可根据实际节点路径调整) -->
        <xsl:variable name="start-date" select="xs:date(//date1/text())"/>
        <xsl:variable name="end-date" select="xs:date(//date2/text())"/>

        <!-- 生成起始日期次日到结束日期的序列(对应示例中2023-03-11至2023-03-14) -->
        <xsl:variable name="date-range" select="$start-date + xs:dayTimeDuration('P1D') to $end-date"/>

        <!-- 过滤周末,计算工作日数量 -->
        <xsl:variable name="workday-count" select="count($date-range[not(fn:day-from-date(.) = (6,7))])"/>

        <xsl:text>两个日期之间的工作日数:</xsl:text>
        <xsl:value-of select="$workday-count"/>
    </xsl:template>
</xsl:stylesheet>

关键细节说明

  • 动态日期获取:通过//date1/text()和//date2/text()直接从XML中提取日期字符串,适配日期变动的场景,可根据实际XML节点路径调整XPath表达式。
  • 日期序列生成:$start-date + xs:dayTimeDuration('P1D') to $end-date用于生成不包含起始日期的序列,对应示例中的计算结果为2(2023-03-13、2023-03-14),与需求匹配。
    • 若需包含起始日期的总工作日数,直接使用$start-date to $end-date即可,示例中结果为3(2023-03-10、2023-03-13、2023-03-14)。
  • 周末过滤:fn:day-from-date(.)返回日期对应的星期值(1=周一,7=周日),通过not(fn:day-from-date(.) = (6,7))排除周六和周日。

注意事项

  • 需使用支持XSLT 3.0的处理器(如Saxon HE/PE/EE)。
  • 输入日期必须为ISO 8601标准格式(YYYY-MM-DD),若格式不符,需先通过fn:parse-date()或自定义模板做格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:53:25