倭マン's BLOG

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

システムリソースからスタイルシートを読み込む (1)

Java プログラム内から XSL 変換を実行するには、スタイルシートを読み込む必要があります。 ユーザーが提供するスタイルシートを読み込む場合は通常のファイルを読み込む方法で問題ありませんが、スタイルシート自体を開発者が提供する場合(スタイルシートがシステムリソースの場合)は少し注意が必要です。

今回はまず、スタイルシートが1つの XSL ファイルだけ(<import>, <include> 要素を持たない)の場合を扱います。

ソースファイルの配置


サンプルコードとして次の2つのファイルを用意します:

ファイル名 パス 説明
Main.java org/sample/ XSL 変換を実行する main() メソッドをもつクラス
stylesheet.xsl org/sample/resources/xsl/ 開発者が作成したスタイルシート

「stylesheet.xsl」は <import>, <include> 要素を含まなければ何でも構いません(内容は略)。

Main.java


「Main.java」は XSL 変換を実行する main() メソッドをもつクラスです。 main() メソッド内で変換する手順は以下のようになります(以前の記事と同じです):

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

サンプルコードは以下のようになります(「sample.xml」というファイルに XSL 変換を行っています):

package org.sample;

import java.io.InputStream;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class Main {

    public static void main(String[] args) throws TransformerException{

        // 1. TransformerFactory オブジェクトを生成する
        TransformerFactory factory = TransformerFactory.newInstance();
        
        // 2. Transformer オブジェクトを生成する
        InputStream stylesheet = ClassLoader.getSystemResourceAsStream(
                                                        "org/sample/resources/xsl/stylesheet.xsl");
        Transformer transformer = factory.newTransformer(new StreamSource(stylesheet));
        
        // 3. 変換を実行
        transformer.transform(
                new StreamSource("sample.xml"), 
                new StreamResult(System.out));
    }
}

「リソースの解放」処理は無視(笑) 以前のサンプルと異なるのは、スタイルシートを読み込む際に ClassLoader.getSystemResourceAsStream(String) を用いることです(このメソッドの雑な説明はこちら)。