デベロッパーズコーナー: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 {
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
関連キーワード:
プログラミング