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

如何在保留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>

关键说明

  1. 身份模板:这是保留原结构的核心,所有未被专门匹配的内容都会被原样复制,不会丢失任何节点或属性。
  2. 非空判断:normalize-space(.) != ''确保只处理有实际内容的日期节点(排除全空格的空节点)。
  3. 字符串处理:XSLT 1.0中substring的起始索引从1开始,因此前4位取年,第5-6位取月,第7-8位取日,再用concat添加分隔符。
  4. 节点匹配灵活性:如果你的日期节点是通用的date标签,把匹配规则改成match="date[normalize-space(.) != '']"即可。

内容的提问来源于stack exchange,提问作者roi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:12:45