4

ファイルシステムへの書き込みを避けるために、xsl結果ドキュメントの書き込みを妨害する方法が必要です。現在、テンプレートは一時ディレクトリに書き込んでおり、そのディレクトリを圧縮しています。ファイルシステムへの書き込みを行わずにやりたいです。サクソンプロセッサを使用しています。標準の Java ライブラリのみを使用するソリューションが推奨されます。どんな提案でも大歓迎です。

編集: .net saxon api のこのクラスを見つけましたhttp://www.saxonica.com/documentation/dotnetdoc/Saxon/Api/IResultDocumentHandler.html Java に相当するものが必要です。

4

3 に答える 3

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

于 2012-12-26T17:24:54.417 に答える
0

new StreamResult(ByteArrayOutputStream())ファイルに書き込みたくない場合は、xslt出力をキャッチするために使用できます。次に、このアプローチを使用して、バイト配列からzipファイルにメモリデータを保存できます。Javaの場合:byte []配列からファイルをzipする方法は?

于 2012-12-25T12:34:43.980 に答える
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);
    
于 2014-07-02T20:24:45.870 に答える