【发布时间】:2020-02-15 15:51:24
【问题描述】:
我正在使用 Saxon PE 9.7.0.18。
我正在用如下代码编译 XSLT:
import javax.xml.transform.TransformerFactory;
import net.sf.saxon.TransformerFactoryImpl;
...
StringBuilder errorString = new StringBuilder();
ErrorListener errorListener = new ErrorListener() {
public void warning(TransformerException e) {
errorString.append("\nERROR: ").append(e.getMessageAndLocation()); }
public void error(TransformerException e) {
errorString.append("\nWARN: ").append(e.getMessageAndLocation()); }
public void fatalError(TransformerException e) {
errorString.append("\nFATAL: ").append(e.getMessageAndLocation()); }
};
TransformerFactoryImpl transformerFactory =
(TransformerFactoryImpl) TransformerFactory.newInstance(
TransformerFactoryImpl.class.getName(),
DocumentGenerator.class.getClassLoader());
transformerFactory.setErrorListener(errorListener);
Templates templates = transformerFactory.newTemplates(new DOMSource(xslt));
xsltTransformerFactory = new XsltTransformerFactory() {
@SneakyThrows(TransformerConfigurationException.class)
@Override public Transformer newTransformer() { return templates.newTransformer(); }
};
Transformer transformer = xsltTransformerFactory.newTransformer();
很遗憾,如果 XSLT 文件无效,则会产生如下错误:
FATAL: Required item type of first operand of '/' is node();
supplied value has item type xs:string
XSLT 文件有时长达数千行,因为它们是从另一个系统生成的。知道发生这样的错误的哪一行会非常有帮助。 (刚才我通过重复删除 XSLT 源文件的一半并查看错误是否仍然发生来进行“二进制搜索”,以找到有问题的行。一旦我找到该行,XSLT 文件中的错误就非常明显了! )
我确定 XSLT 处理器必须知道它正在处理的行?
在调试器中,我看到TransformerException 包含一个AttributeLocator,但lineNumber 和columnNumber 属性均为-1,这大概解释了为什么getMessageAndLocation() 方法不包含该位置。
我知道在 Saxon 的编译过程中可能会有一个编译时标志来影响这一点,但我没有自己编译 Saxon,我是在购买 PE 版时从https://www.saxonica.com/download/java.xml 下载的。
如何找出 XSLT 错误的行号?
【问题讨论】:
标签: saxon