XPath での外部関数の使用

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

手順

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

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

    表 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) 関数の引数のいずれかまたは戻り値が、単一のノード、あるいはアトミック値またはノードのシーケンスである場合に使用します。
    以下の例は、外部関数を使用する XPath 式の作成方法を示しています。
    // Create the factory
    XFactory factory = XFactory.newInstance();
    
    // Create a new static context
    XStaticContext staticContext = factory.newStaticContext();
    
    // Declare a namespace for the function
    staticContext.declareNamespace("my", "http://myfunc");
    
    // Create a QName for the name of the function
    QName methodQName = new QName("http://myfunc", "pow");
    
    // Declare the function on the static context
    staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME});
    
    // Create an XPath executable for the expression
    XPathExecutable executable = factory.prepareXPath("sum(/polynomial/term/(my:pow(2, @power) * @coefficient))", staticContext);
  2. 外部関数を使用する XPath 式を実行するには、XDynamicContext インスタンスを使用して関数を実装する Java メソッドを指定 (またはバインド) します。

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

    XPath 式の実行時に使用される変数に Java メソッドが指定されていない場合は、エラーが表示されます。

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

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

    メソッド名 目的
    bindFunction(QName qname、Method メソッド) 静的メソッドをバインドするときに使用します。
    bindFunction(QName qname、Method メソッド、Object instanceObject) インスタンス・メソッドをバインドするときに使用します。
    以下の例は、まず最初に、関数に使用されるメソッドをバインドしてから、1 番目の例で作成された XPath 式を実行したものです。 この例では、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 expression
    XSequenceCursor result = executable.execute(source, dynamicContext);
    
     
    // Serialize the result to System.out
    result.exportItem(new StreamResult(System.out));

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



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