8. Transformer
- 8.1. Transformer
- 8.2. 基本的な変換
- 8.3. 出力方式の設定
- 8.4. パラメータの設定
8.1 Transformer
これまで、DOMツリーをXML文書として出力するために、Transformerオブジェクトを使用してきました。Transfomerは、JAXP付属のXSLTプロセッサーです。Transformerは、XMLのソースツリーを結果ツリーに変換するオブジェクトです。DOMに限らず、XSLT スタイルシートに基づいてXMLを変換することも可能です。
8.2 基本的な変換
それでは、Transformerを使用したXMLの変換について、見ていきましょう。people.xmlを、sample.xslにしたがって変換します。
sample.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">A Person</xsl:template>
</xsl:stylesheet>
people.xml
<?xml version="1.0"?>
<people>
<person born="1912" died="1954">
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>computer scientist</profession>
<profession>mathematician</profession>
<profession>cryptographer</profession>
</person>
<person born="1918" died="1988">
<name>
<first_name>Richard</first_name>
<middle_initial>P</middle_initial>
<last_name>Feynman</last_name>
</name>
<profession>physicist</profession>
<hobby>playing the bongoes</hobby>
</person>
</people>
プログラムは以下のようになります。
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.Source;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileOutputStream;
public class TransformerSample{
public static void main(String args[]) throws Exception{
Source xsltSource=new StreamSource(new File("sample.xsl"));
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer(xsltSource);
Source source = new StreamSource(new File("people.xml"));
Result result = new StreamResult(System.out);
transformer.transform(source, result);
}
}
まず、Transformerインスタンスを取得します。TransformerオブジェクトはTranformerFactoryのnewTransformerメソッドを使用して取得します。17行目で、TransfomerFactoryのnewInstance()メソッドを使用し、TransformerFactoryのインスタンスを取得しています。18行目でTransformerFactoryのnewTransformerメソッドを使用して、Transformerのインスタンスを取得しています。newTranformerの引数には、スタイルシートを指定します。スタイルシートとして、Sourceインタフェースを実装したオブジェクトインスタンスを指定します。ここでは、sample.xsl ファイルより生成したStreamSourceオブジェクトを引数に指定しています。
Sourceインタフェースについて、もう少し説明しましょう。Sourceインタフェースは、与えられたXMLをTransformerが処理するのに必要なメソッドを提供します。変換元となるXMLもSourceインタフェースを実装したオブジェクトに変換してから、Transformerに渡します。Sourceインタフェースを実装しているクラスには、DOMSource、SAXSource、StreamSourceがあります。 ソースがDOMツリー形式で与えられている場合は、DOMSourceインスタンスを作成します。DOMSourceのコンストラクタの引数にノードを指定すると、指定されたノードをルートノードとするソースツリーが形成されます。ファイルやInputStreamからソースツリーを作る場合は、StreamSourceを利用します。StreamSourceには、以下のようなコンストラクタがあります。
| メソッド | 内容 |
|---|---|
|
public StreamSource(InputStream inputStream) |
バイトストリームから StreamSource を構築します。 |
| public StreamSource(Reader reader) | 文字リーダから StreamSource を構築します。 |
| public StreamSource(String systemId) | URL から StreamSource を構築します。 |
| public StreamSource(File f) | File から StreamSource を構築します。 |
スタイルシートのSourceをStreamSource(InputStream)コンストラクタで取得した場合には注意が必要です。相対 URI
参照を解決できるようにしたい場合は、setSystemId メソッドを呼び出しベースとなるURIを設定する必要があります。
変換後の結果ツリーはResultにより管理されます。Result実装クラスの中で最もよく使用するのはStreamResultクラスでしょう。StreamResultクラスでは、以下のコンストラクタを持ちます。コンストラクタの引数で、出力先を指定しています。
| メソッド | 内容 |
|---|---|
|
public StreamResult(OutputStream outputStream) |
バイトストリームから StreamResult を構築します。 |
| public StreamResult(Writer writer) | 文字ストリームから StreamResult を構築します。 |
| public StreamResult(String systemId) | URL から StreamResult を構築します。 |
| public StreamResult(File f) | File から StreamResult を構築します。 |
例えば、StreamResult(File)コンストラクタを使用して、Resultを構築した場合、結果ツリーはXML文書として引数に指定されたファイルに出力されます。
もう一度、プログラムを確認してみましょう。20行目で、ソースファイルpeople.xmlを指定してSourceを構築しています。21行目では、出力先として標準出力を指定し、Resultを構築しています。最後にTranformerのtransformメソッドを使用して、XMLを変換しています。transformメソッドは、一つ目の引数にSource、2つ目の引数にResultを取ります。
このプログラムを実行すると、以下のように変換結果が標準出力に表示されます。
$ java TransformerSample <?xml version="1.0" encoding="UTF-8"?> A Person A Person
(実習課題1)
8.2で例に挙げたプログラムを修正しなさい。実行時の引数に、変換元となるXMLファイルを指定できるようにしなさい。また、XMLファイルをいろいろ作成し、実行結果を確認しなさい。

