ホーム > X-Plus > XML Square >  デベロッパーズコーナー  >  JavaプログラミングとXML

この記事を送る はてなブックマークに追加する BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
テキストリンクコードを取得する

デベロッパーズコーナー:Javaプログラミングを極める「JAXP XSLT API」

2002年09月04日作成 

Javaプログラミングを極める
第2回:JAXP XSLT API

(株)日本ユニテック
太田 純

<この記事はDigital Xpress 2002 Vol.8(4-5月号)に掲載されたものです>

今回はJAXP (Java API for XML Processing) に含まれる機能を使ったXSLTの扱い方を紹介します。

2002年2月にJava 2 Platform Standard Edition (J2SE) version 1.4が正式リリースされました。このリリースにより、ユーザはJava 2の標準的なランタイムをセットアップするだけでJAXPの機能を利用できるようになったわけです。

本連載の第1回では、JAXPを紹介し、SAXとDOMを使ってXMLデータを読み込む方法を簡単に述べました。JAXPに含まれるもう1つの機能はXSLT (XSL Transformations) で、javax.xml.transformパッケージとして提供されています(注1)。JAXPでは、SAXやDOMの場合と同様に、XMLプロセッサによらずにXSLTを利用できるAPIが定義されています。J2SE 1.4にはXSLTのAPIの実装版としてApacheプロジェクトのXalan(注2)が含められています。

XSLTを使ってみる

では、さっそくXSLTを使ったコーディングをしてみましょう。使用するインターフェイスはTransformerとTransformerFactoryです。基本的には以下のような手順になります。

1. TransformerFactory実装クラスのオブジェクトを取得
2. 取得したTransformerFactoryにTransformerを作ってもらう
3. 作成したTransformerを使用してXMLデータの変換を行う

リスト1を参照してください。このサンプルでは、引数にXSLTファイル名、ソースXMLファイル名、出力ファイル名の3つを渡して実行します。
TransformerFactory実装クラスのオブジェクトは、TransformerFactoryのstaticメソッドであるnewInstance()を使用して取得します。newInstanceメソッド内部では、以下の順序でロードすべきTransformerFactory実装クラスが決定されます。

□javax.xml.transform.TransformerFactoryシステムプロパティ。
□JREディレクトリにあるプロパティファイル「lib/jaxp.properties」。
□実行時に使用可能なjarファイル中にある「META-INF/services/javax.xml.transform.TransformerFactory」で示されたクラス名。
□プラットフォームのデフォルトTransformerFactoryインスタンス。

他のXSLT処理系をセットアップしていなければ、デフォルトではXalanが有効な状態になっているはずです。

リスト1 XSLTTest.java
// XSLTTest.java
// 実行方法:
// java XSLTTest XSLTファイル名 ソースXMLファイル名 出力ファイル名

import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class XSLTTest {
    public static void main(String[] args) {
        try {
            TransformerFactory trfactory = TransformerFactory.newInstance();
            Transformer t = trfactory.newTransformer(
                new StreamSource(args[0]));
            t.transform(
                new StreamSource(args[1]),
                new StreamResult(args[2]));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

XSLTへパラメータを渡す

次に、プログラムからXSLTにパラメータを渡す方法を見てみましょう。ここで使うXSLTファイルをリスト2に、対象となるソースXMLファイルをリスト3に挙げました。

リスト2
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>

<xsl:param name="borderParam" select="1"/>

<xsl:template match="/">
<html>
<head>
<title>新メニュー紹介</title>
</head>
<body>
<h1>新メニュー紹介</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

<xsl:template match="menu">
<table>
<xsl:attribute name="border"><xsl:value-of select="$borderParam"/></xsl:attribute>
<xsl:apply-templates select="item"/>
</table>
<p><xsl:value-of select="footer"/></p>
</xsl:template>

<xsl:template match="item">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="price"/></td>
<td><xsl:value-of select="comment"/></td>
</tr>
</xsl:template>

</xsl:stylesheet>



リスト 3 menu.xml
<?xml version="1.0"?>
<menu>
<item>
<name>チョベリパイ</name>
<price>180円</price>
<comment>生のいちごと生クリームをトッピングしました。</comment>
</item>
<item>
<name>アポーパイ</name>
<price>180円</price>
<comment>りんごをつめこんでシナモンの香りをつけました。</comment>
</item>
<footer>2002年2月更新分</footer>
</menu>

リスト2で強調表示された部分からわかるように、XSLTファイル内では、xsl:param要素でパラメータ名(この場合"borderParam")とデフォルト値を宣言し、xsl:value-of要素で「$パラメータ名」(この場合"$borderParam")として参照しています。ここでは、パラメータの値を、table要素のborder属性として出力します。ここで、リスト1のプログラムにパラメータを渡すためのコードを追加します。リスト4をご覧ください。追加に必要なコードは1行のみです。ここでは、プログラムへ4番目の引数が指定された場合のみ、その値をsetParameterメソッドに渡しています。

リスト4 XSLTTest.java パラメータ追加版
// XSLTTest.java
// 実行方法:
// java XSLTTest XSLTファイル名 ソースXMLファイル名 出力ファイル名 [borderパラメータ]

import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class XSLTTest {
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {
        try {
            TransformerFactory trfactory = TransformerFactory.newInstance();
            Transformer t = trfactory.newTransformer(
                new StreamSource(args[0]));
            if(args.length > 3) {
                t.setParameter("borderParam", args[3]);
            }
            t.transform(
                new StreamSource(args[1]),
                new StreamResult(args[2]));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

図1に4番目のパラメータなしで実行した場合の結果HTMLファイル、図2に4番目のパラメータに「5」を渡した場合の結果HTMLファイルを示します。border属性の変化がわかるでしょうか?

次回はクライアントサイドでXMLを利用する場合の考慮点を扱う予定です。

図1 java XSLTTest menu.xsl menu.xml menu.html 実行結果


図2 java XSLTTest menu.xsl menu.xml menu5.html 5 実行結果

(注1) JAXPに含まれるXSLTのためのAPIはTrAX (Transformation API for XML) と呼ばれることもあります。
(注2) http://xml.apache.org/xalan-j/index.html




関連サービス

IT技術およびIT製品の可用性調査・検証業務



この記事と関連の高い記事

関連キーワード:Java


関連キーワード:プログラミング




ページトップへ戻る