「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 を用いた場合はキチンと変換されるようになったようです