Saxonica 从 xslt 生成 SEF 文件并将其应用于转换
Saxonica Generate SEF file from xslt and apply the same for transformation
我正在尝试 find/know 将 sef 保存在内存中并将其用于转换的正确方法
找到以下两种生成sef文件的方法:
1.使用 xsltpackage.save(File) :它工作正常,但这里需要将内容保存到不符合 我们要求的文件,因为我们需要存储在 memory/db.
2。 XsltExecutable.export() :它生成了文件,但如果我使用相同的 .sef 文件进行转换,我将得到空内容作为输出(结果)。
我在 xslt 中使用 xsl:include 和文档,我使用 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。
更新:通过将 false 设置为 属性 解决了问题(默认情况下为 true)compiler.setJustInTimeCompilation(假);
在内存中保存 SEF 文件没有什么意义(事实上,我会说没有意义)。保留并重复使用 XsltExecutable
或 XsltPackage
对象比将其导出到 SEF 结构然后重新导入要好得多。执行 export/import 的唯一原因是导出器和导入器不共享内存。
但是您可以这样做:我认为您唯一需要更改的是您需要在写入目标流后关闭它。 Saxon 试图坚持政策“任何创建流的人都有责任关闭它”
我正在尝试 find/know 将 sef 保存在内存中并将其用于转换的正确方法
找到以下两种生成sef文件的方法:
1.使用 xsltpackage.save(File) :它工作正常,但这里需要将内容保存到不符合 我们要求的文件,因为我们需要存储在 memory/db.
2。 XsltExecutable.export() :它生成了文件,但如果我使用相同的 .sef 文件进行转换,我将得到空内容作为输出(结果)。
我在 xslt 中使用 xsl:include 和文档,我使用 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。
更新:通过将 false 设置为 属性 解决了问题(默认情况下为 true)compiler.setJustInTimeCompilation(假);
在内存中保存 SEF 文件没有什么意义(事实上,我会说没有意义)。保留并重复使用 XsltExecutable
或 XsltPackage
对象比将其导出到 SEF 结构然后重新导入要好得多。执行 export/import 的唯一原因是导出器和导入器不共享内存。
但是您可以这样做:我认为您唯一需要更改的是您需要在写入目标流后关闭它。 Saxon 试图坚持政策“任何创建流的人都有责任关闭它”