我正在使用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&#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

最佳答案

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


Xalan版本发行说明仅列出了错误编号,没有描述,并且在发布Xalan 2.7.1之后的某个时候,Xalan开发切换到了另一个错误跟踪器。有关其旧的“已修复”错误的信息已消失。

没有任何要证明的问题,任何给定的库都存在问题,我最终将所有与XML和Transformation相关的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%的成功率。

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

关于java - 为什么concat在此XSLT转换中随机复制输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31754954/

10-09 08:11