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ファイルをいろいろ作成し、実行結果を確認しなさい。