【发布时间】:2015-10-23 15:37:53
【问题描述】:
我正在使用 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">
这是我收到的错误输出
<fo:block line-height="13pt����">
(注意意外的输出是 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
【问题讨论】:
-
尝试使用 Apache Xerces 而不是 JDK 版本的 Xerces 作为您的 XML 解析器。 JDK 版本中存在一个长期存在的错误,它偶尔会破坏属性值。我不知道输入属性值的损坏是否可以解释您所看到的症状,但值得一试。
-
我觉得最新的版本是2.11.0,应该放在“endorsed”目录下。如果这对您没有任何意义,请搜索“Xerces 认可目录”。