Xalan Extension Functions

Updated: 2003-03-28 17:28:10 - [ Home | Wiki Home | Index | Changes ]

Xalanを使うと、XSLTからJavaのメソッドを関数として呼び出すことができます。

目次

手順
拡張用の名前空間の宣言のしかた(3種類)
呼び出しかた
staticメソッドの呼び出し
インスタンスの作成
インスタンスメソッドの呼び出し
デフォルトインスタンス
宣言した名前空間を結果から外す
参照
脚注

手順

  1. 名前空間を宣言する
  2. 名前空間を使ってメソッドを呼び出す

これだけです。

拡張用の名前空間の宣言のしかた(3種類)

名前空間の宣言のしかたには、3つのフォーマットがあります。

クラスフォーマット。

xmlns:プレフィックス="xalan://パッケージ名.クラス名" 
(例) xmlns:map="xalan://java.util.HashMap" 

パッケージフォーマット。

xmlns:プレフィックス="xalan://パッケージ名"
(例) xmlns:util="xalan://java.util" 

Javaフォーマット。

xmlns:プレフィックス="http://xml.apache.org/xalan/java"
(例) xmlns:java="http://xml.apache.org/xalan/java"

呼び出しかた

名前空間をどのスタイルで宣言したかによって、呼び出し方が変わってきます。といっても、単にクラス名やパッケージ名がつくかどうかが変わるだけです。

staticメソッドの呼び出し

クラスフォーマットで名前空間を宣言した場合は、つぎのようにしてstaticメソッドを呼び出します。

(クラスフォーマット)
<xsl:value-of select="プレフィックス:staticメソッド名(引数)"/>

(例)<xsl:value-of select="system:currentTimeMillis()"/>

パッケージフォーマットで名前空間を宣言した場合は、staticメソッド名の前に、クラス名やサブパッケージ名が付きます。

(パッケージフォーマット)
<xsl:value-of select="プレフィックス:クラス名.staticメソッド名(引数)"/>
<xsl:value-of select="プレフィックス:サブパッケージ名.クラス名.staticメソッド名(引数)"/>

(例) <xsl:value-of select="javalang:System.currentTimeMillis()"/>

Javaフォーマットの場合は、完全限定名(パッケージの最初からクラス名まで全部)が必要です。1

(Javaフォーマット)
<xsl:value-of select="プレフィックス:パッケージ名.クラス名.staticメソッド名(引数)"/>

(例) <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>

インスタンスの作成

xsl:variable要素を使って、変数にオブジェクトをセットできます。

(クラスフォーマット)
<xsl:variable name="変数名" select="プレフィックス:new(引数)"/>

(パッケージフォーマット)
<xsl:variable name="変数名" select="プレフィックス:クラス名.new(引数)"/>
<xsl:variable name="変数名" select="プレフィックス:サブパッケージ名.クラス名.new(引数)"/>

(Javaフォーマット)
<xsl:variable name="変数名" select="プレフィックス:パッケージ名.クラス名.new(引数)"/>


(例)<xsl:variable name="items" select="list:new()"/>
(例)<xsl:variable name="items" select="util:ArrayList.new()"/>

インスタンスメソッドの呼び出し

第1引数をインスタンスにします。

(全フォーマット共通)
<xsl:value-of select="プレフィックス:メソッド名(インスタンスをセットした変数, 引数)"/>

(例)<xsl:value-of select="list:get($items, 1)"/>

デフォルトインスタンス

クラスフォーマットで名前空間を宣言した場合、その名前空間はデフォルトのインスタンスを一つだけ持つことができます。

デフォルトインスタンスは明示的に作成する必要がありません。メソッドが呼ばれたときに、自動的に作成されます。メソッドは次のようにして呼びます。

(クラスフォーマットのみ)
<xsl:value-of select="プレフィックス名:メソッド名(引数)"/>

これにより、デフォルトインスタンスが(まだ作成されていない場合は)作成され、そのインスタンスのメソッドが呼ばれます。

引数無しのコンストラクタがない場合はエラーになります。

宣言した名前空間を結果から外す

拡張機能を使用するために宣言した名前空間は、結果の中に含まれる必要はありません。結果から不必要な名前空間を省くには、xsl:stylesheet/xsl:transform に exclude-result-prefixes 属性を指定します。exclude-result-prefixesの値は、空白で区切ったプレフィックスです。

参照

脚注

[1] と、マニュアルには書いてあるんですが、なぜかjavaパッケージを勝手に先頭に付けてしまうようでした。たとえばjava:java.lang.Stringは、java.java.lang.Stringを探しに行くようです。なんでだろう?


KOSEKI Kengo <kengo@tt.rim.or.jp>