捕获xsl结果文档的输出流

时间:2012-12-25 10:53:10

标签: java xslt saxon

我需要一种干扰写入xsl结果文档的方法,以避免将它们写入文件系统。现在我的模板正在写入临时目录,然后我压缩该目录。我想做那个whitout写到文件系统。我正在使用撒克逊处理器。提供仅使用标准Java库的解决方案。任何建议都表示赞赏。

编辑:我在.net saxon api http://www.saxonica.com/documentation/dotnetdoc/Saxon/Api/IResultDocumentHandler.html找到了这个课程 我需要一些与java相同的东西。

3 个答案:

答案 0 :(得分:4)

您需要实现接口net.sf.saxon.OutputURIResolver
http://www.saxonica.com/documentation/javadoc/net/sf/saxon/lib/OutputURIResolver.html
您可以根据需要在resolve方法中重定向输出。在我的例子中,这是实现类的样子。

public class ZipOutputURIReslover implements OutputURIResolver{

    private ZipOutputStream zipOut;

    public ZipOutputURIReslover(ZipOutputStream zipOut) {
        super();
        this.zipOut = zipOut;
    }

    public void close(Result arg0) throws TransformerException {
        try {
            zipOut.closeEntry();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Result resolve(String href, String base) throws TransformerException {
        try {
            zipOut.putNextEntry(new ZipEntry(href));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new StreamResult(zipOut);
    }
}

在此之后,您需要将net.sf.saxon.OutputURIResolver注册到trasnformer工厂。

ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("file.zip"));
factory.setAttribute("http://saxon.sf.net/feature/outputURIResolver", new ZipOutputURIReslover(zipOut));

加载模板并运行转换时,所有xsl:result-documents将直接写入zipOutputStream。

在这里找到答案http://sourceforge.net/p/saxon/discussion/94027/thread/9ee79dea/#70a9/6fef

答案 1 :(得分:0)

如果您不想写入文件,可以使用new StreamResult(ByteArrayOutputStream())来捕获xslt输出,然后使用这种方法将内存数据从字节数组保存到zip文件In Java: How to zip file from byte[] array?

答案 2 :(得分:0)

请注意,Saxon的最新版本要求href(URI)是唯一的。因此,输出解析器中的流的系统ID也必须是唯一的。

例如:

  1. 在样式表中指定结果文档href值

    <xsl:result-document href="{$filename}" method="text">
    
  2. 创建输出解析器

    public class ZipOutputURIReslover implements OutputURIResolver{
    
        private ZipOutputStream zipOut;
    
        public ZipOutputURIReslover(ZipOutputStream zipOut) {
            super();
            this.zipOut = zipOut;
        }
    
        public void close(Result arg0) throws TransformerException {
            try {
                zipOut.closeEntry();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public Result resolve(String href, String base) throws TransformerException {
            try {
                zipOut.putNextEntry(new ZipEntry(href));
            } catch (IOException e) {
                e.printStackTrace();
            }
            Result result = new StreamResult(zipOut);
            // Must ensure the stream is given a unique ID
            result.setSystemId(UUID.randomUUID().toString());
            return result;
        }
    }
    
  3. 将输出解析器连接到变压器

    ZipOutputURIResolver outputResolver = new ZipOutputURIResolver(outputStream);
    // Controller is the Saxon implementation of the JAXP Transformer
    ((Controller) transformer).setOutputURIResolver(outputResolver);