撒克逊 URI 解析器

Saxonica URI Resolver

我们有包含多个 xsl:include /document 的 xslt 文件,我正在缓存 XsltExecutable 对象(已编译的 xsl)并用于多个线程的转换。

我的问题是,我们是否需要在编译和执行转换期间提供URIResolver?,编译样式sheet(XsltExecutable 对象)不包括所有related/dependent 风格 sheets?.

在我的例子中,如果我没有在两个地方都提供 URIResolver,我会收到错误消息。无论如何我们可以保留常见 xsls 的 XsltExecutable 并将其包含在其他 xslts 的 compilation/execution 阶段。

注意:我们正在使用 saxonica EE

public void transform(XsltExecutable stylesheet,Map<String, String> formatterMap, String sourceXMl, String outFileName) throws SaxonApiException {

       Processor processor = new Processor(true);
       Serializer out = processor.newSerializer(new File(outFileName + ".xml"));
       out.setOutputProperty(Serializer.Property.METHOD, "xml");
       out.setOutputProperty(Serializer.Property.INDENT, "yes");

       Xslt30Transformer trans = stylesheet.load30();
       trans.setURIResolver(new CigURIResolver(formatterMap));
       trans.transform(new StreamSource(new StringReader(sourceXMl)), out);
       System.out.println("Output written to out.xml");

   }

XsltCompiler 上的 URIResolver 主要用于解析编译时 xsl:includexsl:import 声明。 XsltTransformer 上的 URIResolver 主要用于解析 doc()document() 函数的 运行 次调用。

一个XsltExecutable代表一个完整的编译样式表。如果您想独立编译样式表的不同部分,并且 link 将单独编译的部分以不同的组合组合在一起,那么您需要将其定义为多个单独的包,使用新的 XSLT 3.0 结构 xsl:packagexsl:use-package(而不是 xsl:import/xsl:include)。在 API 级别,编译包使用 XsltPackage 对象表示。