2012-12-25 40 views
4

我需要一種方法來干擾寫入xsl結果文件,以避免將它們寫入文件系統。現在我的模板正在寫入一個臨時目錄,然後我壓縮該目錄。我想這樣做,無需寫入文件系統。我正在使用saxon procesor。一個只使用標準Java庫的解決方案是可以實現的。任何建議表示讚賞。捕獲xsl結果文件的輸出流

編輯:我發現這個類.NET API薩克森http://www.saxonica.com/documentation/dotnetdoc/Saxon/Api/IResultDocumentHandler.html 我需要的東西等同爲Java。

回答

4

您需要實現接口節省內存的數據到壓縮文件net.sf.saxon.OutputURIResolver
http://www.saxonica.com/documentation/javadoc/net/sf/saxon/lib/OutputURIResolver.html
無論你喜歡,你都可以用解析方法重定向輸出。在我的情況下,這是實現類的樣子。

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

'factory.setAttribute( 「http://saxon.sf.net/feature/outputURIResolver」,新ZipOutputURIReslover(zipOut));' 可以實際替換: 'transformer.getUnderlyingController()setOutputURIResolver(outputURIResolver。 );',其中'transformer'是'XsltTransformer'類的一個實例。 –

0

您可以使用new StreamResult(ByteArrayOutputStream())趕上XSLT輸出,如果你不希望寫入文件,然後你可以從字節數組使用這種方法In Java: How to zip file from byte[] array?

+1

問題是我不需要從「變換」函數中捕獲xslt輸出。該輸出總是空文件。我需要捕獲在模板中調用的函數的輸出流。我需要以某種方式干擾撒克遜人處理這個模板函數和撒克遜人處理這些輸出流。文件名是相關的,我不知道這個模板將產生多少結果文件。它取決於輸入的xml文檔。 – Sten

0

注意近期撒克遜的版本要求在href(URI)是獨一無二的。因此輸出解析器中的流的系統ID也必須是唯一的。

例如:

  1. 指定在樣式表

    <xsl:result-document href="{$filename}" method="text"> 
    
  2. 結果文檔HREF值創建輸出解析器

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