|
Apache Xalan-JなどのJavaのXSLTプロセッサを使ってXSLTを行う環境では、
XSLで使われる関数をJavaで書いて組み込むことができます。
これは特別なAPIがあるわけではなく、普通のstaticメソッドを作ればOKです。
package ushi.xslt;
public class Functions {
public static boolean contains2(String s, String target){
if(target == null || target.equals("")){
return false;
}
return s.indexOf(target) >= 0;
}
}
|
このクラスは1つのstaticメソッド、contains2を持ちます。
それはXSL組み込みのcontains()関数と同様に、1つめの引数の文字列中に、
2つめの引数で指定した部分文字列が含まれるかどうかを返します。
但し、部分文字列が空文字列の場合、偽を返します。
この例では1クラス1メソッドですが、別に複数のメソッド(関数)を1クラスに含めてもOKです。
これをコンパイルし、出来上がったJavaクラスを
XSLTプロセッサのCLASSPATHに通しておき、次のようなXSLで変換します
(一部です。このままは使えません)。
<?xml version="1.0" encoding="euc-jp"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ushi="http://www.w3.org/1999/XSL/Transform/java/ushi.xslt.Functions"
version="1.0">
<xsl:param name="targetStr" select="aaa" />
<xsl:template match="/document/file">
<xsl:variable name="doc" select='document(@href)' />
<xsl:variable name="xmluri"><xsl:value-of select="@href"/></xsl:variable>
<table border="1">
<xsl:for-each select="$doc//document/category/entry">
<xsl:if test="ushi:contains2(qq, $targetStr) or ushi:contains2(aa, $targetStr)">
<tr>
<td><a href="{$xmluri}#{id}"><xsl:value-of select="id"/></a></td>
<td><xsl:copy-of select="qq"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
|
自作関数を使うには、冒頭の名前空間のところでそのクラスを指定し、
呼び出す際には「名前空間:メソッド名」の形で呼び出します。
(first uploaded 2005/11/18 last updated 2005/11/18, URANO398)
|