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