XSLT での外部関数の使用

外部関数を使用する XSLT スタイルシートを使用する場合は、XStaticContext インスタンスを使用して関数シグニチャーを宣言し、XDynamicContext インスタンスを使用して関数ごとに Java 実装を指定 (またはバインド) します。

手順

  1. 外部関数を使用する XSLT スタイルシートを作成する場合は、XStaticContext インスタンスを使用して関数シグニチャーを宣言します。

    XStaticContext インターフェースには 2 つの declareFunction メソッドがあります。各メソッドには 3 つのパラメーターがあり、名前、関数の戻りの型、および引数の型の配列を示します。 名前は常に QName オブジェクトとして指定されますが、型には、QName または XSequenceType を指定できます。関数名、戻りの型、および引数の型によって、関数を一意的に識別する必要があります。

    スタイルシート関数は、外部関数と同じ名前を保持できます。 スタイル・シート関数に値が yes のオーバーライド属性がある場合、 スタイル・シート内のその関数名への参照はスタイル・シート関数への参照になります。スタイルシート関数に値が no のオーバーライド属性がある場合は、外部関数への参照になります。

    表 1. XStaticContext declareFunction メソッド.

    以下の表に、declareFunction メソッドの各書式を使用する時機を示します。

    メソッド・シグニチャー 目的
    declareFunction(QName 名、QName 型、QName[] argTypes) 関数の戻り値と引数がすべて単一のアトミック値である場合に使用します。

    QName 型は、組み込み型、あるいは XStaticContext インスタンスの作成に使用される XFactory インスタンスに登録済みのスキーマ内で宣言されたグローバル型を参照します。QName がアトミック以外の型を参照する場合、プロセッサーはそれを element(*, ns:type) 型として扱います。ここで、ns:type は所定の QName です。XTypeConstants インターフェースには、 組み込みの型ごとに QName オブジェクトを指定できる便利な定数があります。

    declareFunction(QName 名、XSequenceType 型、XSequenceType[] argTypes) 関数の引数のいずれかまたは戻り値が、単一のノード、あるいはアトミック値またはノードのシーケンスである場合に使用します。
    以下のスタイルシートでは、QName ext:pow が参照する外部関数を使用しています。
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:ext="http://www.example.com/functions"
                    version="2.0">
    
        <xsl:output method="text"/>
    
        <xsl:template match="polynomial">
            <xsl:variable name="p" select="."/>
    
            <xsl:for-each select="1 to 5">
                <xsl:text>x = </xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>; </xsl:text>
                <xsl:value-of select="for $t in $p/term return concat($t/@coefficient, 'x^', $t/@power)"
                              separator=" + "/>
                <xsl:text> = </xsl:text>
                <xsl:value-of select="sum($p/term/(ext:pow(current(), @power) * @coefficient))"/>
                <xsl:text>&#xA;</xsl:text>
            </xsl:for-each>
        </xsl:template>
    
    </xsl:stylesheet>
    該当のスタイル・シートが xsltSource ソース・オブジェクトを使用して使用可能であると仮定すると、以下のコードでスタイル・シートが作成されます。
    // Create the factory
    XFactory factory = XFactory.newInstance();
    
    // Create a new static context
    XStaticContext staticContext = factory.newStaticContext();
    
    // Declare a namespace for the function
    staticContext.declareNamespace("ext", "http://www.example.com/functions");
    
    // Create a QName for the name of the function
    QName methodQName = new QName("http://www.example.com/functions", "pow");
    
    // Declare the function on the static context
    staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME});
    
    // Create an XSLT executable for the stylesheet
    XSLTExecutable executable = factory.prepareXSLT(xsltSource, staticContext);
  2. 外部関数を使用する XSLT スタイルシートを実行するには、XDynamicContext インスタンスを使用して関数を実装する Java メソッドを指定 (またはバインド) します。

    Java リフレクションを使用して、関数の java.lang.reflect.Method オブジェクトを取得します。メソッドがインスタンス・メソッドである場合は、 この関数のバインド時にインスタンス・オブジェクトが必要となります。

    XSLT スタイルシートの実行時に使用される関数に Java メソッドが指定されていない場合は、エラーが表示されます。

    XDynamicContext には 2 つの bindFunction メソッドがあります。 各メソッドには、関数の名前に対応する QName オブジェクトと、関数の実装を提供する Java メソッドを識別する Method オブジェクトが必要です。
    表 2. XDynamicContext bindFunction メソッド.

    この表に、XDynamicContext bindFunction メソッドの各書式を使用する時機を示します。

    メソッド名 目的
    bindFunction(QName qname、Method メソッド) 静的メソッドをバインドするときに使用します。
    bindFunction(QName qname、Method メソッド、Object instanceObject) インスタンス・メソッドをバインドするときに使用します。
    以下の例は、まず最初に、関数に使用されるメソッドをバインドしてから、1 番目の例で作成された XSLT スタイルシートを実行したものです。 この例では、java.lang.Math クラスの静的メソッドである pow(double a, double b) が、外部関数の実装を提供するために使用されています。
    // Create a new dynamic context
    XDynamicContext dynamicContext = factory.newDynamicContext();
    
    // Retrieve the java.lang.reflect.Method object for this function
    Method method = Math.class.getMethod("pow", Double.TYPE, Double.TYPE);
    
    // Bind the function to the dynamic context
    dynamicContext.bindFunction(methodQName, method);
    
    // Create an XML input document
    String xml = "<polynomial>" +
    "<term power='2' coefficient='3'/>" +
    "<term power='1' coefficient='-2'/>" +
    "<term power='0' coefficient='1'/>" +
    "</polynomial>";
    StreamSource source = new StreamSource(new StringReader(xml));
    
    // Execute the stylesheet
    XSequenceCursor result = executable.execute(source, dynamicContext);
     
    // Serialize the result to System.out
    result.exportItem(new StreamResult(System.out), executable.getOutputParameters());

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_xslt
ファイル名:txml_funcs_xslt.html