如何在保留XML原结构的前提下修改worker节点date字段格式
解决XML日期格式转换并保留原结构的XSLT方案
核心思路
通过身份模板完整保留XML原有结构,仅对非空的日期类节点做格式转换,将YYYYMMDD字符串转为YYYY-MM-DD日期格式。
示例输入XML
<workers> <worker> <id>1</id> <join_date>20140101</join_date> <leave_date></leave_date> <name>John Doe</name> </worker> <worker> <id>2</id> <join_date></join_date> <leave_date>20201231</leave_date> <name>Jane Smith</name> </worker> </workers>
期望输出XML
<workers> <worker> <id>1</id> <join_date>2014-01-01</join_date> <leave_date></leave_date> <name>John Doe</name> </worker> <worker> <id>2</id> <join_date></join_date> <leave_date>2020-12-31</leave_date> <name>Jane Smith</name> </worker> </workers>
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:原样复制所有未被特殊匹配的节点、属性、文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配非空的日期节点(按需修改节点名称,比如join_date/leave_date) --> <xsl:template match="join_date[normalize-space(.) != '']|leave_date[normalize-space(.) != '']"> <xsl:copy> <!-- 拆分YYYYMMDD格式,拼接为YYYY-MM-DD --> <xsl:value-of select="concat( substring(., 1, 4), '-', substring(., 5, 2), '-', substring(., 7, 2) )"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键说明
- 身份模板:这是保留原结构的核心,所有未被专门匹配的内容都会被原样复制,不会丢失任何节点或属性。
- 非空判断:
normalize-space(.) != ''确保只处理有实际内容的日期节点(排除全空格的空节点)。 - 字符串处理:XSLT 1.0中
substring的起始索引从1开始,因此前4位取年,第5-6位取月,第7-8位取日,再用concat添加分隔符。 - 节点匹配灵活性:如果你的日期节点是通用的
date标签,把匹配规则改成match="date[normalize-space(.) != '']"即可。
内容的提问来源于stack exchange,提问作者roi
相关产品推荐
相关产品推荐

