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