如何用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>
关键逻辑解释
- 日期类型转换:用
xs:date()将XML中的字符串日期转为标准XML Schema日期类型,支持后续日期序列生成与运算。 - 生成日期序列:通过
$start-date to $end-date生成两个日期之间的连续日期序列(包含起始和结束日期)。 - 过滤非工作日:
position() > 1排除起始日期,只统计起始日之后到结束日的日期fn:day-from-week()返回日期对应的星期数(1=周一,7=周日),过滤掉6(周六)和7(周日)
- 统计工作日数量:用
count()函数统计符合条件的日期总数,即为所求工作日天数。
输出结果
<workingDate>2</workingDate>
内容的提问来源于stack exchange,提问作者Iamfitz
相关产品推荐
相关产品推荐

