我们有多个xsl:include /document的xslt文件,我正在缓存XsltExecutable对象(已编译的xsl),并且同样用于多个线程的转换。
我的问题是,我们是否需要在URIResolver期间为提供编译和执行转换?已编译样式表(XsltExecutable对象)不包括所有相关/依赖的样式表?
在我的例子中,如果我没有在两个地方提供URIResolver,我就会出错。无论如何,我们可以保留公共xsls的XsltExecutable,并在其他xslt的编译/执行阶段包含它。
注意事项:我们使用的是萨克索尼卡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");
}发布于 2021-05-25 17:44:54
URIResolver on XsltCompiler主要用于解析编译时xsl:include和xsl:import声明。URIResolver在XsltTransformer上主要用于解析对doc()和document()函数的运行时调用。
XsltExecutable表示一个完整的已编译样式表。如果希望独立编译样式表的不同部分,并将单独编译的部分以不同的组合链接到一起,则需要使用新的XSLT3.0构造xsl:package和xsl:use-package (而不是xsl:import/xsl:include)将其定义为多个单独的包。在API级别,编译后的包使用XsltPackage对象表示。
https://stackoverflow.com/questions/67692426
复制相似问题