XPath 関数内のパラメーター

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  SPS ファイル: 追加機能 > ユーザー定義 XPath 関数 >

XPath 関数内のパラメーター

ユーザー定義 XPath 関数には任意の数のパラメーターを割り当てることができます。関数のパラメーターは XPath 関数ダイアログのパラメーターペインにて定義されます(以下のスクリーンショットを参照)。これらパラメーターは、ユーザー定義 XPath 関数の定義(関数のボディーペイン)にて使用することができます。

 

ユーザー定義 XPath 関数のメカニズム

XPath 関数は以下のように動作します:

 

1.自動計算などで定義された関数呼び出しにて指定された引数の数は、ユーザー定義関数(以下のスクリーンショットにある、ユーザー定義関数のパラメーターペイン)にて定義されたパラメーターの数にマッチしなければなりません。更に、関数呼び出し内の各引数に対して与えられたアイテムの数も、対応するパラメーターにて定義された出現のオプションにマッチする必要があります。パラメーターに対してデータ型の制約が与えられている場合、引数により与えられた値もそのデータ型にマッチする必要があります。
2.関数のパラメーターに対して渡された引数は、XPath 関数(以下のスクリーンショットに示される関数ボディー)にて使用されることになります。XPath 条件式を評価した結果は、オプションとして定義することのできる戻り値の型に対してチェックされます。データ型が期待されたものである場合、関数を呼び出した XPath 条件式にてその結果が使用されることになります。

 

パラメータの順序

関数が呼び出されると、パラメーターペインにて定義された順序に従って呼び出しに使用される引数がパラメーターへ渡されます(以下のスクリーンショットを参照ください)。

 

XPFxParams

 

上のスクリーンショットにあるようなユーザー定義 XPath 関数の sps:Stock が定義され、以下の XPath 条件式により呼びだされた場合を考えてみましょう:

 

      sps:Stock($XML, Node1, Node2)

 

これら3つの引数 ($XMLNode1Node2) は、関数のパラメーターにて定義された順序に従い、それぞれ $contextstock$Selection$StockInfo へ渡されます。

 

関数呼び出しにて記述された各引数はコンマにより分離されていることに注目してください。これにより、コンマにより区切られた関数呼び出し内の各引数が対応するパラメーターへ渡されることになります。

 

パラメーターペイン内にあるパラメーターの順序は、パラメーターペインにある追加挿入削除アイコンを使用することで変更することができます。

 

パラメータのデータ型

オプションとして、ユーザー定義関数におけるパラメーターのデータ型を定義することができます。データ型が指定された場合、入力された引数のデータ型がパラメーターのデータ型に対してチェックされ、型がマッチしない場合にはエラーが返されます。この機能により、(関数呼び出しの引数から得られる)入力データをチェックすることができます。

 

出現

ユーザー定義 XPath 関数の各パラメーターは、シーケンスとして考えることができます。パラメーターの出現プロパティにより、関数呼び出しの引数からそのパラメーターに対してどれだけのアイテムを送信することができるのかを指定することができます。

 

関数の定義と関数呼び出しの両方において、パラメーターや引数の分離だけではなく、シーケンス内にあるアイテムの分離にもコンマは使用されます。そのため、使用されている文脈から、コンマがパラメーター/引数の分離に使用されているのか、またはシーケンスのアイテムを分離するのに使用されているのかを理解する必要があります。

 

パラメーター/引数は、括弧により関数定義内のパラメーターや関数呼び出し内の引数にあるシーケンスを分離することができます。
シーケンス内にある括弧は無視されます。

 

理解を深めるための例とその説明を以下に示します:

 

パラメーター/引数内部にある括弧avg()count() といったいくつかの XPath 2.0 関数は、単一のシーケンスを引数として受け取ります。このシーケンスにて値がコンマにより区切られる場合、または範囲演算子が使用されている場合、シーケンスを括弧で囲むことにより、それらの値がコンマにより区切られた複数のシーケンスではなく、単一のシーケンスであることを明示的に示す必要があります。例えば、avg((count($a), $b, $c)) という関数呼び出しにて、XPath 2.0 関数の avg()(count($a), $b, $c) という単一のシーケンスを引数として受け取ります。シーケンスのアイテムを列挙することで、3つのアイテムからなるシーケンスが構成されるため、引数は単一の引数として、括弧で囲まれた形式で avg() 関数へ渡す必要があります: avg((count($a), $b, $c))。内側に記述された括弧が無い場合、3つの引数が avg() 関数に対して渡されることになり、(avg() 関数ではシーケンスからなる1つの引数しか期待されていないため)エラーが返されることになります。
パラメーター/引数内部に括弧を使用しない: 上の例と同様に、count() 関数も単一のシーケンスを関数の引数として受け取ります。しかし、この例で示された count($a) という呼び出しでは、コンマによる区切りは行われておらず、変数/パラメーターの $a により値の取得が行われます。そのため引数内部にて括弧を使用する必要はなく、count($a) という表現は正しいものとなります。
関数呼び出し内にある括弧とコンマ: 関数呼び出しでは、(XPath 関数ダイアログのパラメーターペインにて定義された)対応するパラメーターに対して各引数が使用されるように、括弧を適切に使用する必要があります。例えば、MyAverage() というユーザー定義 XPath 関数の定義にて avg(count($a), $b, $c) という XPath 2.0 条件式が使用された場合、MyAverage((1,2,3),4,5) という関数呼び出しは妥当なものとなります。シーケンスの (1,2,3) がパラメーター $a に対して与えられ、シングルトンシーケンスの 45$b$c にそれぞれ与えられます。オプションとして、シングルトンシーケンスを括弧で囲むこともできます。MyAverage() から返される値は、この場合 4 となります。

 


(C) 2019 Altova GmbH