如何用XSLT 3.0结合XPATH计算两日期间的工作日(排除周末)?
XSLT 3.0 计算两个日期间的工作日数(排除周末)
核心思路
XSLT 3.0原生支持标准日期类型与序列操作,无需依赖1.0的扩展函数。通过以下步骤实现:
- 用
xs:date()将输入的日期字符串转换为标准日期类型 - 生成两个日期之间的完整日期序列
- 过滤掉周六(星期值为6)和周日(星期值为7)的日期
- 统计剩余工作日的数量
完整代码示例
假设输入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
相关产品推荐
相关产品推荐

