Saxonica从xslt生成SEF文件,并将其应用于转换

Saxonica从xslt生成SEF文件,并将其应用于转换,xslt,saxon,Xslt,Saxon,我试图找到/知道在内存中保存sef并将其用于转换的正确方法 找到以下两种生成sef文件的方法: 1。使用xsltpackage.save(File):它可以正常工作,但这里需要将内容保存到一个不符合我们要求的文件中,因为我们需要存储在内存/db 2。XsltExecutable.export():它生成了一个文件,但如果我使用相同的.sef文件进行转换,我将得到空内容作为输出(结果) 我在xslt中使用xsl:include和document,并使用URI解析器解析它们 我使用下面的逻辑来生成和

我试图找到/知道在内存中保存sef并将其用于转换的正确方法

找到以下两种生成sef文件的方法:

1。使用xsltpackage.save(File):它可以正常工作,但这里需要将内容保存到一个不符合我们要求的文件中,因为我们需要存储在内存/db

2。XsltExecutable.export():它生成了一个文件,但如果我使用相同的.sef文件进行转换,我将得到空内容作为输出(结果)

我在xslt中使用xsl:include和document,并使用URI解析器解析它们

我使用下面的逻辑来生成和转换

注意:我使用的是萨克森ee(试用版)

1.XsltExecutable.export()

当使用从上述导出方法生成的sef进行转换时,我得到的是空内容。.同样的代码可以使用从XsltPackage.save()生成的sef

更新:通过将false设置为属性(默认情况下为true)编译器来解决问题。setJustInTimeCompilation(false

在内存中保存SEF文件没有什么意义(事实上,我会说没有意义)。最好保留并重用
XsltExecutable
XsltPackage
对象,而不是将其导出到SEF结构然后重新导入。执行导出/导入的唯一原因是导出器和导入器不共享内存


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

您要找的东西不太清楚,您的标题和第一篇介绍都谈到“从xslt生成SEF文件”,但接下来的一句话是“需要将内容保存到不符合我们要求的文件中,因为我们需要存储在内存/db中”建议文件系统上的文件是您不想要的。谢谢,更新了问题->“将sef保存在内存中并将其用于转换”谢谢Micheal,手动关闭流解决了关于存储对象而不是sef文件的问题(认为它是自动关闭的),我们计划将它们持久化/保留在redis缓存中,多个线程/实例将访问它们。。。感谢您将尝试选项。看起来net.sf.saxon.s9api.XsltExecutable不可序列化,必须使用XML formatUPDATE:通过将false设置为属性(默认为true)编译器解决了问题。setJustInTimeCompilation(false);不确定它是否与xslt内容有关。有趣的是,我希望执行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;
        }
    }
    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");

}