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的日期扩展函数实现:
- 先在XSLT文档头部引入EXSLT日期命名空间:
xmlns:date="http://exslt.org/dates-and-times"
- 通过字符串拆分获取年、月、日:
年份处理
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
相关产品推荐
相关产品推荐

