JavaでXSLT変換処理。DOMSourceだと何故かダメ。

JDKによるのかもしれないけれど、腑に落ちない結果が出たのでメモっておきます。

JDKバージョン
jdk1.5.0_11

↓よくあるXSLT変換処理の例。

import java.io.FileOutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

// .......省略......

    try{
        StreamSource xsltSrc = new StreamSource(xsl);
        StreamSource source  = new StreamSource(xml);
        StreamResult result  = new StreamResult(new FileOutputStream(output));

        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer(xsltSrc);
        transformer.transform(source, result);
    }catch(Exception e){
        e.printStackTrace();
    }

上記例は、ちゃんとうまく変換されます。
Transformerクラスのtransformメソッドは

transform(javax.xml.transform.Source, javax.xml.transform.Result)

で、Sourceインターフェースを実装しているクラスにはjavax.xml.transform.stream.StreamSourceのほかに、javax.xml.transform.dom.DOMSourceもあるはずなので、XSLやXMLがorg.w3c.dom.Documentのときは、

import java.io.FileOutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.dom.DOMSource;

import org.w3c.dom.Document;

// .......省略......

    try{
        DOMSource xsltSrc = new DOMSource(xsl);
        DOMSource source  = new DOMSource(xml);
        StreamResult result  = new StreamResult(new FileOutputStream(output));

        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer(xsltSrc);
        transformer.transform(source, result);
    }catch(Exception e){
        e.printStackTrace();
    }

でもうまくいくと思うじゃないですか?思いますよね?思いません??

な・ぜ・か・・・・うまくいかないんです。
XSLファイルの内容が出力されます。つД`)°゜。

じゃあ、XSLやXMLがorg.w3c.dom.Documentのときはどうすればいいのか・・・
・・・結局、DocumentからStreamSourceをなんとか作ることにしました。orz
↓こんな感じで。orz

// DocumentからStreamSourceをがんばって作る
Transformer workTransform = factory.newTransformer();
StringWriter sWriter = new StringWriter();
workTransform.transform(new DOMSource(xml), new StreamResult(sWriter));
StringReader sReader = new StringReader(sWriter.toString());
StreamSource source  = new StreamSource(sReader);

ちなみに、TransformerにXSL指定なしでtransform(つまり、sourceのXMLをそのままStreamに流し込む)の場合は、sourceがDOMSourceでもちゃんと動作します。
XSLかXMLがDOMSourceの場合はNG、どちらもDOMSourceの場合もNG・・・うーん・・・