Updated: 2003-03-28 17:28:10 - [ Home | Wiki Home | Index | Changes ]
Xalanを使うと、XSLTからJavaのメソッドを関数として呼び出すことができます。
これだけです。
名前空間の宣言のしかたには、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メソッドを呼び出します。
(クラスフォーマット) <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を探しに行くようです。なんでだろう?