捕获xsl结果文档的输出流

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

编辑:我发现这个类为.net saxon api http://www.saxonica.com/documentation/dotnetdoc/Saxon/Api/IResultDocumentHandler.html我需要一些与java相同的东西。

您需要实现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

您可以使用new StreamResult(ByteArrayOutputStream())来捕获xslt输出,如果您不想写入文件,然后您可以使用此方法将内存数据从字节数组保存到zip文件中Java:如何从中压缩文件byte []数组?

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

例如:

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

      
  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);