倭マン's BLOG

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

TransformerFactory, Transformer

今回から何回かにわたって「javax.xml.transform パッケージ」内のクラスを見ていきます(一覧)。

javax.xml.transform パッケージ内には、XSL 変換 (XSLT : XML Stylesheet Language Transformation) を行うための API が定義されています*1

ただしパッケージ名の「transform」は、この「XSL 変換」とともに、「オブジェクトモデルの変換」という意味も含まれているようです。 つまり、org.w3c.dom.Document を org.dom4j.Document に変換したり、XML ファイルとして書き出したりする汎用的な API を提供します。

最低限使用するインターフェース・クラス


まずは、変換を行うために最低限必要なインターフェース、クラスを見ていきましょう。

インターフェース・クラス 役割
TransformerFactory Transformer オブジェクトを生成するファクトリクラスです。
Transformer 変換を実行するクラスです。
Source 入力となる XML 文書やスタイルシートを抽象化したインターフェースです。
Result 出力となる XML 文書を抽象化したインターフェースです。
TransformerConfigurationException Transformer オブジェクトの生成に失敗した際に投げられる例外です。
TransformerException 変換の実行に失敗した際に投げられる例外です。



使用方法


以下で、各インターフェース、クラスの使用方法を見ていきましょう。 ただし今回は SourceResult オブジェクトは外部から与えられるものとします。 これらについては次回以降に。

「XSL 変換」と「オブジェクトモデルの変換」の違いは TransformerFactory オブジェクトから Transformer オブジェクトを取得する時のみで、変換の手順はほとんど同じです。

★XSL 変換★

XSL 変換の手順は以下のようになります:

  1. TransformerFactory オブジェクトを生成する
  2. Transformer オブジェクトを生成する
  3. 変換を実行する

Java コードは次のようになります:

    public void transformByStylesheet(Source stylesheet, Source src, Result result)
            throws TransformerConfigurationException, TransformerException{

        // 1. TransformerFactory オブジェクトを生成する
        TransformerFactory factory = TransformerFactory.newInstance();

        // 2. Transformer オブジェクトを生成する
        Transformer t = factory.newTransformer(stylesheet);

        // 3. 変換を実行する
        t.transform(src, result);
    }

TransformerFactory オブジェクトから Transformer オブジェクトを生成する際に、スタイルシートを表す Source オブジェクトを引数にして newTransformer() メソッドを呼び出します。

★オブジェクトモデルの変換★

「オブジェクトモデルの変換」も手順は「XSL 変換」とほぼ同じなので、別立てで書く必要はあまりないかも知れませんが、まぁ一応。

違いは TransformerFactory オブジェクトから Transformer オブジェクトを生成する際に、引数のない newTransformer() メソッドを使用することだけです。 この変換は XML 文書としては何も変換しないので、恒等変換 (identity transformation) と呼ばれます。

Java コードは以下のようになります:

    public void transformObjectModel(Source src, Result result)
            throws TransformerConfigurationException, TransformerException{

        // 1. TransformerFactory オブジェクトを生成する
        TransformerFactory factory = TransformerFactory.newInstance();

        // 2. Transformer オブジェクトを生成する
        Transformer t = factory.newTransformer();

        // 3. 変換を実行する
        t.transform(src, result);
    }

また、以下のように書くことも出来ます:

    public void transformObjectModel(Source src, Result result)
            throws TransformerConfigurationException, TransformerException{
        Transformer t = TransformerFactory.newInstance().newTransformer();
        t.transform(src, result);
    }

*1:以前は TrAX (Transformation API for XML) とも呼ばれてました。