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

XQuery实现空元素时动态填充当前年月日值的方法

动态填充XML中空缺的年/月/日为当前日期值

问题场景

给定XML请求报文:

<POORDERLIN>    
    <POLINESCHD>
        <DATETIME  qualifier="NEEDDELV"  type="T"  index="1">
            <YEAR>2022</YEAR>
            <MONTH>09</MONTH>
            <DAY>13</DAY>
            <HOUR>15</HOUR>
            <MINUTE>11</MINUTE>
            <SECOND>50</SECOND>
            <SUBSECOND>0000</SUBSECOND>
            <TIMEZONE>+0200</TIMEZONE>
        </DATETIME> 
    </POLINESCHD>
</POORDERLIN>

当<YEAR>、<MONTH>、<DAY>元素值为空时,需要自动填充当前系统的年、月、日,替代原有的硬编码方式。

原尝试代码(硬编码年份):

if data($POORDERLIN/POLINESCHD[1]/DATETIME/YEAR="") then (
 data($POORDERLIN/POLINESCHD[1]/DATETIME/YEAR="2022")
 )
 else ( 
   data($POORDERLIN/POLINESCHD[1]/DATETIME/YEAR)
 )

解决方案

方案1:XSLT 2.0+(推荐)

利用XSLT 2.0及以上的标准日期函数,直接动态获取并格式化当前日期,匹配原报文的格式要求:

年份处理

if (data($POORDERLIN/POLINESCHD[1]/DATETIME/YEAR) = "") then
  format-date(current-date(), "[Y0001]")
else
  data($POORDERLIN/POLINESCHD[1]/DATETIME/YEAR)

月份处理

if (data($POORDERLIN/POLINESCHD[1]/DATETIME/MONTH) = "") then
  format-date(current-date(), "[M01]")
else
  data($POORDERLIN/POLINESCHD[1]/DATETIME/MONTH)

日期处理

if (data($POORDERLIN/POLINESCHD[1]/DATETIME/DAY) = "") then
  format-date(current-date(), "[D01]")
else
  data($POORDERLIN/POLINESCHD[1]/DATETIME/DAY)
  • current-date():获取当前系统的本地日期(不含时间部分)
  • format-date():按指定格式输出日期,[Y0001]保证4位年份,[M01]和[D01]保证两位的月/日,和原报文的格式完全匹配

方案2:XSLT 1.0(兼容旧环境)

XSLT 1.0没有原生日期函数,需要借助EXSLT的日期扩展函数实现:

  1. 先在XSLT文档头部引入EXSLT日期命名空间:
xmlns:date="http://exslt.org/dates-and-times"
  1. 通过字符串拆分获取年、月、日:

年份处理

if (data($POORDERLIN/POLINESCHD[1]/DATETIME/YEAR) = "") then
  substring(date:date(), 1, 4)
else
  data($POORDERLIN/POLINESCHD[1]/DATETIME/YEAR)

月份处理

if (data($POORDERLIN/POLINESCHD[1]/DATETIME/MONTH) = "") then
  substring(date:date(), 6, 2)
else
  data($POORDERLIN/POLINESCHD[1]/DATETIME/MONTH)

日期处理

if (data($POORDERLIN/POLINESCHD[1]/DATETIME/DAY) = "") then
  substring(date:date(), 9, 2)
else
  data($POORDERLIN/POLINESCHD[1]/DATETIME/DAY)
  • date:date():返回YYYY-MM-DD格式的当前日期字符串,通过substring()截取对应部分即可得到年、月、日的值

内容的提问来源于stack exchange,提问作者The real Van Gogh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:01:16