为什么 concat 在此 XSLT 转换中随机复制输出?

Why is concat randomly duplicating output in this XSLT transformation?

我正在使用 XSLT 将 HTML 转换为 XSL-FO。我们正在从 HTML 转换为 XSL-FO 的事实可能与回答这个问题无关。

对于我的几个使用 concat 作为字体大小和高度的值,concat 的输出会随机复制一次以进行一次调用。

示例:对于以下代码,$lineheight-td 的值为 13

<fo:block line-height="{concat($lineheight-td, 'pt')}">

这是我通常收到的预期正确输出:

<fo:block line-height="13pt">

这是我在约 1% 的时间内收到的错误输出:

<fo:block line-height="13pt13pt">

这是我收到的错误输出 < 1%:

<fo:block line-height="13pt&#0;&#0;&#0;&#0;">

(注意意外输出是 4 个字符('1''3''p''t')并且意外的 '&#0;' 产生了 4 次).

这些重复的输出来自 concat 在不同位置调用来自同一输入 HTML 文件的不同迭代。

我目前的解决方法是如果输出不好就重新转换;到目前为止,这解决了问题,并证明这与数据无关,但重复输出不应该首先发生。我在多线程 Java 环境下 运行,但我为每个单独的转换调用使用新的 Transformer,来自一次初始化的共享 Template应用程序启动。

为什么 concat 会发生这种情况,我该如何解决?

该应用程序使用较旧的 Xalan 库 (2.7.0)。我将研究 Xalan 错误并升级到 Xalan 2.7.1 或更高版本。

环境:

JBoss 7.2.0
JRE 1.7.0_45
xalan-2.7.0
xml-apis-1.3.04
xml-apis-ext-1.3.04

Java代码:

String inputData = ...; // OUR HTML

Templates template = (Templates)templatesMap.get("HTML2FO");
Transformer transformer = template.newTransformer();
StreamSource streamSource = new StreamSource(new StringReader(data));
StringWriter writer = new StringWriter();
transformer.transform(streamSource, new StreamResult(writer));

String outputData = writer.toString();  // OUR FO

The application uses an older Xalan library (2.7.0). I'm going to look into Xalan bugs and upgrading to Xalan 2.7.1 or higher.

Xalan 版本发行说明仅列出错误编号而没有描述,并且在发布 Xalan 2.7.1 后的某个时候,Xalan 开发切换到不同的错误跟踪器。关于他们的旧 "fixed" 错误的信息已经消失。

没有任何问题 "prove" 任何给定的库都有问题,我最终将所有 XML- 和转换相关的 JAR 文件更新为以下版本:

JAR FILE NAME           VERSION
serializer.jar          2.7.2
xalan.jar               2.7.2
xerxesImpl.jar          2.11.0
xml-apis.jar            1.4.01
xml-apis-ext.jar        1.4.01

对于使用原始 XML 库的约 8,000 次转换,我的成功率为 99%;失败的文件在第二次迭代中成功重新处理,这表明问题不在我的数据上。

对于使用更新后的 XML 库的约 11,500 次转换,我的成功率为 100%。

我会继续测试,但我可以得出结论,更新所有库似乎已经解决了问题。