Saxonica URIResolver 中的异常处理

Posted

技术标签:

【中文标题】Saxonica URIResolver 中的异常处理【英文标题】:Exception handling in Saxonica URIResolver 【发布时间】:2021-09-28 07:47:28 【问题描述】:

我正在使用 saxonica EE 版本进行 xslt 转换,并从自定义 URI Resolver 类中抛出异常(如下所示),它适用于 #include 但同样不适用于 #document(),

    无论如何我们可以通过在解析 document() 时抛出异常来停止转换。 是否可以在编译过程中(在生成 SEF 时)将 URI 解析器应用于 document()。

公共类 CustomURIResolver 实现 URIResolver

    @Override
    public Source resolve(String href, String base) 
                String formatterOrlookUpKey = getKey(href);
        if (formatterMap.containsKey(formatterOrlookUpKey)) 
            return new StreamSource(new StringReader(formatterMap.get(formatterOrlookUpKey)));
         else 
            throw new RuntimeException("did not find the lookup/formatter xsl " + href+" key:"+formatterOrlookUpKey);
        

    

XSLT 编译:

Processor processor = new Processor(true);
            XsltCompiler compiler = processor.newXsltCompiler();
            compiler.setJustInTimeCompilation(false);
            compiler.setURIResolver(new CigURIResolver(formatterMap));
            XsltExecutable stylesheet = compiler.compile(new StreamSource(new StringReader(xsl)));
            stylesheet.export(destination);

转型

Processor processor = new Processor(true);
        XsltCompiler compiler = processor.newXsltCompiler();
        compiler.setJustInTimeCompilation(true);
            XsltExecutable stylesheet = compiler.compile(new StreamSource(new StringReader(sef)));

        final StringWriter writer = new StringWriter();
        Serializer out = processor.newSerializer(writer);
        out.setOutputProperty(Serializer.Property.METHOD, "xml");
        out.setOutputProperty(Serializer.Property.INDENT, "yes");
        Xslt30Transformer trans = stylesheet.load30();
        trans.setURIResolver(new CigURIResolver(formatterMap));
        trans.setErrorListener(errorHandler);
        trans.transform(new StreamSource(new StringReader(xml)), out);
        Object obj = out.getOutputDestination();

【问题讨论】:

您是否为 XsltCompiler 和 Xslt30Transformer 设置了一个解析器?向我们展示您设置解析器的相关代码,并告诉我们“不工作”的确切含义,您的解析器是否未被调用,您的异常是否不会停止 XSLT 转换? 我使用相同的 URI 解析器类,但包含和文档的对象不同.. XsltCompiler 工作正常,Xslt30Transformer 没有停止转换,即使我抛出运行时异常,如代码所示。 【参考方案1】:

我对观察到的效果有点惊讶,需要一个复制品来调查它。但我也有点惊讶您选择抛出 RuntimeException,而不是 URIResolver 接口声明的 TransformerException。如果您想进一步探索这一点,请使用可运行代码提出支持请求。

由于 XSLT 1.0 遗留的“可恢复错误”,document() 的规则有点复杂:您可能会发现 doc() 的行为更具可预测性。

关于 doc() 调用的编译时解析,Saxon 确实有启用该选项的选项,但它不能很好地处理 SEF 文件:通常在 SEF 文件中包含外部文档会变得非常混乱,特别是如果例如,您有多个全局变量绑定到同一文档的不同部分。

【讨论】:

感谢 Michael,将 URI 解析器异常更改为 TransformerException,但转换仍然没有抛出任何错误。

以上是关于Saxonica URIResolver 中的异常处理的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 saxonica 将 xml 转换为 graphviz

如何使用 saxonica 将 xml 转换为 graphviz

如何使用 XSLT saxonica 将 xml 转换为点? [复制]

如何对字符串中的 XML 运行 XQuery?

如何知道一个类是用openjdk还是sunjdk编译的?

XSLT 代码的优化