FORG0001:无效日期。非数字部分

FORG0001: Invalid date. Non-numeric component

我正在尝试使用 XSLT 将 XML 转换为另一种格式。将日期从一种格式转换为另一种格式时,出现以下验证错误。 FORG0001:无效日期“22/12/2020 18:16:34”。非数字部分

输入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>

XSLT 模板

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/ft_tnx_record">
        <release_dttm>
            <xsl:value-of select="format-date(release_dttm,'[Y0001]-[M01]-[D01]')"/>
        </release_dttm>
    </xsl:template>
</xsl:stylesheet>

驱动程序Java程序

public class Main {
    public static void main(String[] args) throws TransformerException {
        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);
    }
}

我正在使用 XSLT 2.0 版和 Saxon-8.7

所以尝试 replace(release_dttm, '([0-9]{2})/([0-9]{2})/([0-9]{4}) (.+)', '--T') 转换为 xs:dateTime 格式,正如 Michael Kay 指出的那样,完整的代码需要转换并使用正确的 format 函数,例如

  <xsl:value-of select="format-dateTime(xs:dateTime(replace(release_dttm, '([0-9]{2})/([0-9]{2})/([0-9]{4}) (.+)', '--T')),'[Y0001]-[M01]-[D01]')"/>

需要在 XSLT 中声明 xmlns:xs="http://www.w3.org/2001/XMLSchema",才能使用 xs:dateTimexs:date 函数。

format-date() 期望第一个参数是 xs:date 类型;但是如果您提供一个无类型的节点,就像您在这里所做的那样,它会尝试将该节点的字符串值转换为 xs:date 值。如果输入不是标准 ISO 日期格式 yyyy-mm-dd,此转换将失败(错误 FORG0001)。强烈建议在 XML 中存储日期时使用国际日期格式,因为像 03/04/2019 这样的格式是不明确的。但是,如果您无法更改 XML,则需要按照@MartinHonnen 的建议将其手动转换为 yyyy-mm-dd 格式。