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

如何用XSLT 3.0结合XPath计算两个日期间的工作日天数

XSLT 3.0计算两个日期间工作日天数的实现方案

需求说明

基于给定的XML输入,计算/trade/exerciseDate/adjustedDate(2023-03-10,周五)与/trade/cashPaymentDate/adjustedDate(2023-03-14,周二)之间的工作日天数(排除周六、周日),预期输出为<workingDate>2</workingDate>。

输入XML

<trade>
    <exerciseDate>
        <adjustedDate>2023-03-10</adjustedDate>
    </exerciseDate>
    <cashPaymentDate>
        <adjustedDate>2023-03-14</adjustedDate>
    </cashPaymentDate>
    <currency>EUR</currency>
    <effectiveDate>
        <adjustedDate>2023-03-14</adjustedDate>
        <dateAdjustments>
            <businessDayConvention>NONE</businessDayConvention>
        </dateAdjustments>
    </effectiveDate>
    <terminationDate>
        <unadjustedDate>2024-03-14</unadjustedDate>
        <dateAdjustments>
            <businessDayConvention>MODFOLLOWING</businessDayConvention>
        </dateAdjustments>
    </terminationDate>
</trade>

XSLT 3.0实现代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <workingDate>
            <xsl:value-of select="
                let $start-date := xs:date(trade/exerciseDate/adjustedDate),
                    $end-date := xs:date(trade/cashPaymentDate/adjustedDate),
                    $date-sequence := $start-date to $end-date
                return
                    count(
                        $date-sequence[
                            position() > 1 
                            and not(xs:integer(fn:day-from-week(.)) = (6, 7))
                        ]
                    )
            "/>
        </workingDate>
    </xsl:template>

</xsl:stylesheet>

关键逻辑解释

  1. 日期类型转换:用xs:date()将XML中的字符串日期转为标准XML Schema日期类型,支持后续日期序列生成与运算。
  2. 生成日期序列:通过$start-date to $end-date生成两个日期之间的连续日期序列(包含起始和结束日期)。
  3. 过滤非工作日:
    • position() > 1排除起始日期,只统计起始日之后到结束日的日期
    • fn:day-from-week()返回日期对应的星期数(1=周一,7=周日),过滤掉6(周六)和7(周日)
  4. 统计工作日数量:用count()函数统计符合条件的日期总数,即为所求工作日天数。

输出结果

<workingDate>2</workingDate>

内容的提问来源于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 09:55:03