gpt4 book ai didi

java - XSLT 转换有时会失败

转载 作者:行者123 更新时间:2023-12-02 10:42:41 25 4
gpt4 key购买 nike

我不是 XSLT 方面的专家,我有一个无法用变压器解释的问题。此问题仅在生产使用中出现:我自己无法重现它。

我有一个进程接收 XML 消息(通过 JMS 队列)。该消息必须转换为另一个 XML。

这是执行转换的代码:

final TransformerFactory factory = TransformerFactory.newInstance();
final Templates templates = factory.newTemplates(new StreamSource(xsl));

final Transformer xformer = templates.newTransformer();

try (final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final InputStream inputStream = new ByteArrayInputStream(message.getBytes())) {

final Source source = new StreamSource(inputStream);
final Result result = new StreamResult(outputStream);

xformer.transform(source, result);

....
}

在原始 XML 中,我收到格式为 yyyyMMdd(作为字符串)的日期,但我需要格式为 yyyy-MM-dd。

<xsl:template match="INVOICE_DATE_FROM">
<xsl:call-template name="fctFormatDate">
<xsl:with-param name="elementName" select="'dateFrom'"/>
<xsl:with-param name="dateParam">
<xsl:value-of select="string(.)"/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>

<xsl:template name="fctFormatDate">
<xsl:param name="elementName"/>
<xsl:param name="dateParam"/>
<xsl:if test="$dateParam != '' and $dateParam != '00000000'">
<xsl:element name="{$elementName}">
<xsl:value-of select="concat(concat(concat(concat(substring($dateParam, '1', '4'), '-'), substring($dateParam, number('5'), '2')), '-'), substring($dateParam, number('7'), '2'))"/>
</xsl:element>
</xsl:if>
</xsl:template>

大多数情况下,它都有效,并且我获得了格式良好的日期。但有时,我会收到类似的信息:

<dateFrom>IN18-07-01</dateFrom>

有人已经见过这个问题之王了吗?或者可以告诉我这段代码有什么问题吗?

非常感谢。

编辑

只有一种精度:我们使用 XSLT 1.0

编辑2

这是 XML 的一部分(我无法向您展示更多内容,因为品牌产品的私有(private)数据作为标签名称)。

<DUNNING_LINE SEGMENT="1">
<INVOICE_NUMBER>*************</INVOICE_NUMBER>
<INVOICE_DUE_DATE>20180731</INVOICE_DUE_DATE>
<INVOICE_TOTAL_AMOUNT>39.49</INVOICE_TOTAL_AMOUNT>
<INVOICE_PAID_AMOUNT>0.00</INVOICE_PAID_AMOUNT>
<INVOICE_DUE_AMOUNT>39.49</INVOICE_DUE_AMOUNT>
<INVOICE_DATE_FROM>20180701</INVOICE_DATE_FROM>
<INVOICE_DATE_TO>20180731</INVOICE_DATE_TO>
<INVOICE_POSTING_DATE>20180630</INVOICE_POSTING_DATE>
</DUNNING_LINE>

最佳答案

从简化代码开始:

<xsl:value-of select="concat(concat(concat(concat(substring($dateParam, '1', '4'), '-'), substring($dateParam, number('5'), '2')), '-'), substring($dateParam, number('7'), '2'))"/>

concat() 接受任意数量的参数,子字符串的第二个和第三个参数是数字,所以这减少到

concat(substring($dateParam, 1, 4), '-', 
substring($dateParam, 5, 2), '-',
substring($dateParam, 7, 2))

这并不能解决您的问题,但调试代码的第一步应该始终是消除不必要的复杂性。

我怀疑的问题是 $dateParam 已经保存了不正确的数据,但是当然您没有向我们提供足够的信息来让我能够测试这个理论。

关于java - XSLT 转换有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52813335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com