XSLT计算XML日期提前20天出现P20D报错问题求助
问题原因
- 类型声明错误:
P20D属于日期时长类型,不能使用xs:dateTime()构造,需改用xs:dayTimeDuration()声明 - 执行顺序错误:你先将原始
YYYY-MM-DD格式的日期转成了MM/DD/YYYY格式的字符串,字符串无法直接参与日期运算,需要先完成日期偏移计算,再做格式转换
修正步骤
- 首先确认你的XSLT根节点已声明XMLSchema命名空间且版本为2.0及以上(日期运算需要2.0+版本支持),示例如下:
<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:stylesheet>
- 修改
format_variable模板中date4分支的逻辑,修改后完整模板代码如下:
<xsl:template name="format_variable"> <xsl:param name="cur_keyref" as="xs:string">MISSING</xsl:param> <xsl:param name="cur_value" as="xs:string">MISSING</xsl:param> <xsl:param name="cur_format" as="xs:string">MISSING</xsl:param> <xsl:choose> <xsl:when test="$cur_format = 'date4'"> <!-- 1. 先转成日期类型,计算往前推20天的结果 --> <xsl:variable name="target_date" select="xs:date($cur_value) - xs:dayTimeDuration('P20D')"/> <!-- 2. 提取月、日、年,补前导零后拼接成MM/DD/YYYY格式 --> <xsl:value-of select="concat( format-number(month-from-date($target_date), '00'), '/', format-number(day-from-date($target_date), '00'), '/', format-number(year-from-date($target_date), '0000') )"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="concat('MISSING_FORMAT_', $cur_keyref, '_', $cur_value, '_[', $cur_format, ']')" /> </xsl:otherwise> </xsl:choose> </xsl:template>
修改后运行即可得到预期输出12/12/2021。
内容的提问来源于stack exchange,提问作者User501
相关产品推荐
相关产品推荐

