incubator@london このページをアンテナに追加 RSSフィード

08/07/2006

XQueryをPHPのように使う

すみません。また,マニアックな独り言です。

最近、eXistというXMLデータベースを触ってみたりしているのだが、そこに付属しているサンプルに面白いサンプルがあった。例えば以下のサンプル。

XQuery Form Example

http://demo.exist-db.org/xquery/hello.xq

画面のSourceを見るというリンクをクリックすればわかるが、hello.xqは以下のようなXQueryのファイルで、このファイルをeXistに付属しているServletが読み込み、結果を出力する。(ApacheのCocoonなどを使っているようだが、あまり詳しくないので細かい動作の仕組みはよくわからない。後でゆっくり調べる。)

xquery version "1.0";
(: How to do plain dynamic Web pages with XQuery and eXist extensions :)

declare namespace request="http://exist-db.org/xquery/request";

let $name := request:get-parameter("name", " you")
return 
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>XQuery Form Example</title>
  </head>
<body>
  <form method="GET">
    Please enter your name: 
    <input type="text" size="40" name="name" />
    <input type="submit" />
  </form>
  Hello { $name } !
  <br/><a href="source/hello.xq">See the XQuery source of this page</a>
</body>
</html>

これは、データベースにアクセスしているわけではないが、正しいXQueryである。しかし、これを最初に見た時にPHPっぽいと思った。例えばPHPで同じように書くとすると、以下のように書けるからである。

<?php $name = (isset($_GET['name']) ? $_GET['name'] : "you"); ?>

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>PHP Form Example</title>
</head>
<body>
  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
    Please enter your name:
    <input type="text" size="40" name="name" />
    <input type="submit" />
  </form> 
  Hello <?php echo $name; ?> !
  <br />
</body>
</html>

これが何で面白いと思ったかというと、XQueryというとXMLデータベースに対する照会言語というカテゴリーに分類されることが多く、リレーショナル・データベースに対するSQLと対比して説明されることが多い(例1)し、僕の認識もそうだったからである。

例1)以下の記事も「SQLと比較しながら」説明している

もっとも、この記事はDB2 9の発表に合わせて出していると想像されるので、データベースを意識して書かれているのはある意味当然かもしれないが。

しかし、上の例を見た時に、XQueryの処理エンジンをデータベース・サーバーに置くのではなく、Webサーバーの拡張として実装して、XQueryをWeb用スクリプト言語として使うのもアイディアとしては面白いな、と思った。今はPHPからSQLを発行してデータベースにアクセスしているわけだが、同じように考えてPHPからXQueryを発行してデータベースにアクセスするというのは、そう考えると二度手間になるわけである。だったら、「XQueryスクリプト」に最初からアクセスすれば良い。まあ、もっともプログラミング言語としての使いやすさを考えると、XQueryだけで複雑なアプリケーションを作るのは無理だろうと思うが、適用範囲をうまく考えればPL/SQLのような感じで使えるかもしれない。(無理か?(笑))

今まであまり考えたことがなかったのだが、こういうアイディアって既に他にもいろいろなところで実装されていたりするのだろうか?

トラックバック - http://d.hatena.ne.jp/stemy/20060708/1152385620