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にデフォルト名前空間宣言の構文を示します。

名前空間宣言、デフォルト名前空間宣言の構文図

名前空間宣言の構文も示していなかったので一緒に示しておきます。デフォルト名前空間宣言でelementを指定すると、デフォルト要素名前空間を宣言できます。デフォルト要素名前空間を定義すると、名前空間接頭辞で修飾されていない要素と型はすべてデフォルト要素名前空間に属するものとして扱われます。

自分のクエリの中で関数を使うだけなのにいちいち名前空間を宣言しなければならないのは少し大袈裟ですね。そのような場合には、宣言せずに使用できる既定義の名前空間接頭辞「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

ページトップへ▲

XMLマスターポイントレッスン ~ プロフェッショナル(データベース)編 ~ 記事一覧へ戻る

HOMEへ戻る