我正在使用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'
)和意外'�'
产生了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/