XMLマスターポイントレッスン ~ プロフェッショナル(データベース)編 ~
第7回 ユーザー定義関数の作成と宣言
ユーザー定義関数と名前空間
関数はいずれかの名前空間に属していなければなりません。LIST1では「my_ns」という名前空間を宣言して使用しています。名前空間接頭辞で関数名を修飾せずに関数を使用すると、XQueryプロセッサはその関数がデフォルト関数名前空間(デフォルト関数名前空間宣言で指定したURIに関連付けられた名前空間)に属すると仮定します。
デフォルト関数名前空間宣言を行なっていない場合は、「fn:」という名前空間接頭辞とURI(http://www.w3.org/2005/xpath-functions)に関連付けされた名前空間が仮定されます。この名前空間はXQueryの標準関数で使用されています。
例えば、LIST1を次のように書き換えると、XQueryプロセッサは名前空間my_nsではなくfnに属するwhoという関数を探しに行き、そのような関数は定義されていない、というエラーが発生します。
(: xquery宣言 :)
xquery version "1.0" encoding "utf-8";
…(省略)…
<result> {
for $p in doc( "namelist.xml")//name
return
<greeting>
{ fn:concat( "Hello, ", who($p) ) }
</greeting>
}
</result>
図Aにデフォルト名前空間宣言の構文を示します。
自分のクエリの中で関数を使うだけなのにいちいち名前空間を宣言しなければならないのは少し大袈裟ですね。そのような場合には、宣言せずに使用できる既定義の名前空間接頭辞「local:」が使用できます。local:のほかにも、fn:やxs:のようにいくつか既定義の接頭辞が準備されています。表Aに既定義の名前空間をまとめておきます。
表A:既定義の名前空間
接頭辞 | URI | 説明 |
xml | http://www.w3.org/XML/1998/namespace | xml:langのようなXML属性の名前空間 |
xs | http://www.w3.org/2001/XMLSchema | XML Schemaの組み込み型の名前空間 |
xsi | http://www.w3.org/2001/XMLSchema-instance | xsi:typeのようなXML Schema instanceの属性の名前空間 |
fn | http://www.w3.org/2005/xpath-functions | XQuery、XPath 2.0の標準関数の名前空間 |
local | http://www.w3.org/2005/xquery-local-functions | メインモジュールで宣言され、ほかのクエリから使用されない関数で使用できる名前空間 |
<掲載> P.195-201 DB Magazine 2007 November