XSLT関数の自作

 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>

 自作関数を使うには、冒頭の名前空間のところでそのクラスを指定し、 呼び出す際には「名前空間:メソッド名」の形で呼び出します。

XML Top

(first uploaded 2005/11/18 last updated 2005/11/18, URANO398)

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!