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

XSLT转换日期时报FORG0001无效日期非数字组件错误如何解决?

错误原因

  • format-date()函数仅支持接收符合ISO 8601标准的xs:date类型参数,你输入的22/12/2020 18:16:34是自定义格式的字符串,既不符合ISO标准格式,还附带了时间部分,无法被直接识别为日期类型。
  • 额外注意你提供的输入XML存在语法错误:根节点<ft_tnx_record>的开标签多写了闭合符/,会先导致XML解析失败,需要先删除这个多余的/。

解决方案

步骤1:修正XML语法

修正后的输入XML如下:

<?xml version="1.0" encoding="UTF-8"?>
<ft_tnx_record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.misys.com/portal/interfaces/xsd/ft.xsd">
    <release_dttm>22/12/2020 18:16:34</release_dttm>
</ft_tnx_record>

步骤2:修改XSLT模板

你需要先把自定义格式的日期字符串解析为标准日期类型,再做格式化,这里有两种实现方式:

方式1:字符串拆分拼接(兼容性最高)

直接对固定格式的字符串做截取重组,不需要依赖日期解析函数:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/ft_tnx_record">
        <release_dttm>
            <!-- 拆分DD/MM/YYYY格式,重组为YYYY-MM-DD -->
            <xsl:value-of select="concat(
                substring(release_dttm,7,4), '-',
                substring(release_dttm,4,2), '-',
                substring(release_dttm,1,2)
            )"/>
        </release_dttm>
    </xsl:template>
</xsl:stylesheet>

方式2:使用日期解析函数(更规范)

用parse-dateTime指定输入格式,转换为标准类型后再格式化:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:template match="/ft_tnx_record">
        <release_dttm>
            <xsl:value-of select="format-date(
                xs:date(fn:parse-dateTime(release_dttm, '[D01]/[M01]/[Y0001] [H01]:[m01]:[s01]')),
                '[Y0001]-[M01]-[D01]'
            )"/>
        </release_dttm>
    </xsl:template>
</xsl:stylesheet>

步骤3:修正Java代码确保加载Saxon实现

JDK默认自带的XSLT处理器是Xalan,仅支持XSLT 1.0,需要显式指定使用Saxon的处理器工厂:

public class Main {
    public static void main(String[] args) throws TransformerException {
        // 显式指定使用Saxon的TransformerFactory,避免用JDK默认的Xalan
        System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
        
        String filePathPrefix = System.getProperty("user.dir") + System.getProperty("file.separator");

        String directImportInputXmlPath = filePathPrefix + "directImportInputXml.xml";
        StreamSource directImportXml = new StreamSource(new File(directImportInputXmlPath));

        String directImportXsltPath = filePathPrefix + "directImportXslt.xslt";
        StreamSource directImportXslt = new StreamSource(new File(directImportXsltPath));

        String directImportOutputXmlPath = filePathPrefix + "directImportOutputXml.xml";
        StreamResult directImportOutputXml = new StreamResult(new File(directImportOutputXmlPath));

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer(directImportXslt);
        transformer.transform(directImportXml, directImportOutputXml);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:24:02