倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

XSLT スタイルシートのソースとしての org.w3c.dom.Document オブジェクト

JavaでXSLT変換処理。DOMSourceだと何故かダメ。」という記事で XSLT スタイルシートの Source として DOMSource が使えないというのが載ってました。 jre 1.5 での話とのことなので、1.6 になったら修正されているかと思って試してみましたが、直ってませんでした*1

その記事にも解決策は書かれてますが、Document オブジェクトを String オブジェクトにそのまま変換するとメモリ的に心配なので、以前の記事で作成した DOMDocumentReader クラスを用いて解決する方法を見てみます(基本的にやってることは同じですが)。

DOMDocumentSource クラス


DOMDocumentReader を Reader オブジェクトとして、StreamSource から Source オブジェクトを生成します。 というより、StreamSource クラスを拡張して、新に DOMDocumentSource クラスを作成します。

public class DOMDocumentSource extends StreamSource{
    
    public DOMDocumentSource(Document doc)throws IOException{
        super.setReader(new DOMDocumentReader(doc));
    }

    @Override public void setInputStream(InputStream inputStream) {}

    @Override public void setReader(Reader reader) {}
}

インスタンス生成後に InputStream や Reader を再設定されないように、setInputStream(), setReader をオーバーライドしておきます。

DOMDocumentSource を使って Transformer オブジェクトを取得する


上記の DOMDocumentSource クラスを使って、以下のように Transformer オブジェクトを取得することが出来ます。

public Transformer getTransformer(Document doc)
        throws TransformerConfigurationException{

    TransformerFactory factory = TransformerFactory.newInstance();

    Source stylesheet = new DOMDocumentSource(doc);
    
    Transformer transformer = factory.newTransformer(stylesheet);

    return transformer;
}

ほとんど、通常の javax.xml.transform パッケージの使い方と同じですね。

*1:変換される Source として DOMSource を用いた場合はキチンと変換されるようになったようです