サンプルで覚えるXSLTプログラミング

15. JavaによるXSLTの拡張

 ここまで、さまざまなXSLTの関数を紹介してきましたが、プログラマの必要な関数のすべてがXSLTで定義されているとはかぎりません。もしも、必要な機能が不足している場合、Javaで関数を書き、それをXSLTプロセッサ上で使用することでXSLTの機能を拡張することができます。しかし、ここで説明するこの機能はXSLTプロセッサの標準ではないため、すべてのXSLTプロセッサで使用できるわけではありませんので、その点に注意してください。

Built-inクラスの呼び出し

 まずは、あらかじめオラクルのXSLTプロセッサに用意されている、JavaのBuilt-inクラスをXSLTプログラムから呼び出してみましょう。今回の主役はJavaの機能ですので、あえてXML文書中のデータを用意していません。

(XML文書:TestJAVAXSL.xml)

TestJAVAXSL.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="TestJAVAXSL.xsl"?>
<page/>

(XSLTプログラム:TestJAVAXSL.xsl)

TestJAVAXSL.xsl
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:file="http://www.oracle.com/XSL/Transform/java/java.io.File"
xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date"
xmlns:urlencoder="http://www.oracle.com/XSL/Transform/
java/java.net.URLEncoder"
xmlns:math="http://www.oracle.com/XSL/Transform/java/java.lang.Math"
exclude-result-prefixes="File Date URLEncoder Math">


<xsl:output method="html" encoding="Shift_JIS"/>

<xsl:template match="/">
  <xsl:if test="not(function-available('file:exists') and
function-available('file:new') )">
      <xsl:message terminate="yes">
      <xsl:text>Required Java File facilities are not found</xsl:text>
    </xsl:message>
</xsl:if>
<html>
  <h1>テスト</h1>
  <xsl:value-of select="date:toString(date:new())"/><br/>
  <xsl:value-of select="urlencoder:encode('http://www.oracle.com?p=test==')"/><br/>
  <xsl:value-of select="math:exp(3)"/><br/>
  <xsl:value-of select="math:cos(3.141592)"/><br/>
  <xsl:value-of select="math:random()"/><br/>
  <xsl:value-of select="math:random()"/><br/>
   </html>
</xsl:template>
</xsl:stylesheet>

これを実行すると、

 このような出力が得られます。Javaのプログラムが呼び出されて、文字列が表示されているわけです。

カスタムメイドの関数を作る

 また、Built-inではなくカスタムメイドでJavaの関数を使用したい場合、例えば下記のように、static関数を持ったclassを作って呼び出すことができます。今回は簡単にjava.lang.Mathクラスのrandom()関数を呼び出しているだけですが、Javaで使用可能なあらゆるロジックを書き込むことが可能です。

(Javaプログラム:TestXSLTJavaExtention.java)

package com.chienowa.xslt;


import java.io.*;
import java.util.*;


public class TestXSLTJavaExtention
{
public static double MyRandom()
{


return java.lang.Math.random();
}
}

 このJavaプログラムは、コンパイルした後xslt.jarとでもして、jarファイルにしておいて、ServletエンジンのCLASSPATHに入れておいてください。詳しい方法は、TomcatなどのServletエンジンのマニュアルを参照してください。

(XSLTプログラム:TestJAVAXSL2.xsl)

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:test="http://www.oracle.com/XSL/Transform/java/
com.chienowa.xslt.TestXSLTJavaExtention">


<xsl:output method="html" encoding="Shift_JIS"/>

<xsl:template match="/">
<html>
  <h1>テスト</h1>
  <xsl:value-of select="test:MyRandom()"/><br/>
</html>
</xsl:template>
</xsl:stylesheet>

 上記のXSLTプログラムで、Javaで定義した関数を呼び出すことができます。

 以上で主なXSLTタグや関数を紹介しました。もちろんこのほかにもこの記事では紹介しきれなかったものがいくつもありますが、それらの使用法については下記の参照文献などを参照してみてください。

 今回の連載XSLT入門の読者の皆様、特に「XSQL入門」から読んでいただいた方々、および編集者の新野氏とアットマーク・アイティに感謝いたします。また、違う連載で皆様に記事を読んでいただく機会があれば幸いです。

[参考文献およびサイト]


Index
サンプルで覚えるXSLTプログラミング
  1. XMLからHTMLへの変換
スタイルシートはどのように解釈されるか
  2. XPathの基礎知識
XML文書をツリー構造で見る
XPathの表記方法
  3. XSLTエレメントの概要
コラム XSLTプロセッサのインストール
  4. テンプレート系XSLTエレメント
テンプレートの定義
該当するテンプレートの適用
指定されたテンプレートの呼び出し
  5. 変数系XSLTエレメント
変数の定義1
変数の定義2
  6. 出力系XSLTエレメント
該当する表現の値を代入
エレメントノードの生成
属性ノードの生成
テキストノードの生成
コメントノードの生成
PI(processing-instruction)の生成
出力方法の指定
  7. フローコントロール系XSLTエレメント
ループ処理
条件分岐
IF文
  8. その他のXSLTエレメント
他のXSLファイルの読み込み
数の割り当て
  9.XSLT関数の概要
関数の主な分類
  10. 文字列系関数
文字列の連結
文字列の調査
数字のフォーマッティング
空白の除去
……
  11. 数値計算系関数
切り上げ
表現の数を数える
切り下げ
数値型への変換
四捨五入
加算
  12. ノードに関する関数
  13. bool代数系関数
  14. その他の関数
15. JavaによるXSLTの拡張
Built-inクラスの呼び出し
カスタムメイドの関数を作る



XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間