微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Saxonica 从 xslt 生成 SEF 文件并将其应用于转换

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。