【问题标题】:How to get the line number where an Saxon XSLT compilation error occurs?如何获取发生 Saxon XSLT 编译错误的行号?
【发布时间】: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,但lineNumbercolumnNumber 属性均为-1,这大概解释了为什么getMessageAndLocation() 方法不包含该位置。

我知道在 Saxon 的编译过程中可能会有一个编译时标志来影响这一点,但我没有自己编译 Saxon,我是在购买 PE 版时从https://www.saxonica.com/download/java.xml 下载的。

如何找出 XSLT 错误的行号?

【问题讨论】:

    标签: saxon


    【解决方案1】:

    您从 DOM 树提供了样式表输入,而 DOM 不保留行号。

    除非您有充分的理由使用 DOM,否则最好避免使用它。 DOM 也不擅长跟踪基本 URI,这会影响 xsl:includexsl:import 的分辨率等。此外,它不是线程安全的。

    优先使用StreamSourceSAXSource

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2011-10-09
      • 2018-11-14
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多