目次へ

8. Transformer

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

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ