如何解决Saxonica 从 xslt 生成 SEF 文件并将其应用于转换
我试图找到/知道将 sef 保存在内存中并将其用于转换的正确方法
1.使用 xsltpackage.save(File) :它工作正常,但这里需要将内容保存到一个不符合我们要求的文件中,因为我们需要存储在 memory/db 中。
2. XsltExecutable.export():它生成了文件,但如果我使用相同的 .sef 文件进行转换,我将得到空内容作为输出(结果)。
我在 xslt 中使用了 xsl:include 和 document,我使用 URI 解析器解析了它们。
我使用以下逻辑来生成和转换。
注意:我使用的是Saxon ee(试用版)。
1.XsltExecutable.export()
public static String getCompiledXslt(String xsl,Map<String,String> formatterMap) throws SaxonApiException,IOException {
try(ByteArrayOutputStream destination = new ByteArrayOutputStream()){
Processor processor = new Processor(true);
XsltCompiler compiler = processor.newXsltCompiler();
compiler.setURIResolver(new CigURIResolver(formatterMap));
XsltExecutable stylesheet = compiler.compile(new StreamSource(new StringReader(xsl)));
stylesheet.export(destination);
return destination.toString();
}catch(RuntimeException ex) {
throw ex;
}
}
使用相同的 SEF 进行转换:
Processor processor = new Processor(true);
XsltCompiler compiler = processor.newXsltCompiler();
if (formatterMap != null) {
compiler.setURIResolver(new CigURIResolver(formatterMap));
}
XsltExecutable stylesheet = compiler.compile(new StreamSource(new StringReader(standardXsl)));
Serializer out = processor.newSerializer(new File("out4.xml"));
out.setoutputProperty(Serializer.Property.METHOD,"xml");
out.setoutputProperty(Serializer.Property.INDENT,"yes");
Xslt30Transformer trans = stylesheet.load30();
if (formatterMap != null) {
trans.setURIResolver(new CigURIResolver(formatterMap));
}
trans.transform(new StreamSource(new StringReader(sourceXMl)),out);
System.out.println("Output written to out.xml");
}
当使用从上面导出方法生成的 sef 进行转换时,我得到空内容..相同的代码与从 XsltPackage.save() 生成的 sef 一起工作正常。
UPDATE:解决了问题,通过将属性设置为 false(默认为 true)compiler.setJustInTimeCompilation(false); >
解决方法
在内存中保存 SEF 文件没有什么意义(事实上,我会说没有意义)。保留和重用 XsltExecutable
或 XsltPackage
对象比将其导出到 SEF 结构然后重新导入要好得多。进行导出/导入的唯一原因是导出器和导入器不共享内存。
你可以这样做,但是:我认为你唯一需要改变的是你需要在写入后关闭目标流。 Saxon 试图坚持“任何创建流的人都负责关闭它”的政策
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。