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 文件没有什么意义(事实上,我会说没有意义)。保留并重复使用 XsltExecutableXsltPackage 对象比将其导出到 SEF 结构然后重新导入要好得多。执行 export/import 的唯一原因是导出器和导入器不共享内存。

但是您可以这样做:我认为您唯一需要更改的是您需要在写入目标流后关闭它。 Saxon 试图坚持政策“任何创建流的人都有责任关闭它”