ものがたり(旧)

atsushieno.hatenablog.com に続く

Uche Ogbuji on Michael Kay on Comparing XSLT and XQuery

っていうややこしいタイトルなのは伝聞のさらに伝聞だからなのだけど、Michael KayがXTech 2005(うーん、行きたかった)で行ったXQueryとXSLT2.0についてのセッションの、Uche Ogbujiによる覚え書き。非常に興味深いのでこちらにもまとめておこう。

XSLT 1.0でユーザーが困惑したのは次の4点*1:

  • XMLそのものにまつわる問題: エンコーディング実体参照、空白文字、名前空間、などなど
  • 宣言的プログラミングの特性: 変数、再帰、パス、グルーピング
  • データモデル: '<'とか'>'の扱いがめんどっちい
  • テンプレート パターンマッチ(ルールベースの記述)
  • 結果ツリーとnodesetの違い
  • 関数のサポートが貧弱

で、XQueryが解決したのって、たかだか4点目の問題だけなんじゃないの?っていうはなし。
そして、XQueryのFLWORでみんなjoinクエリが最適化できることを期待しているんだけど、そんなこと全然出来てないじゃん、あるいはXSLT実装でもおんなじことが出来るはずだよ、っていう話に進んでいったらしい。

'<'や'>'って、リテラルXMLが記述できるXQueryでも当然エスケープしなきゃいけないし、結果ツリーなんてXPath2.0/XSLT2.0でも当然消えているわけで、XQueryにアドバンテージは何もない。当然、XQuery 1.0とXPath 2.0の関数には何の違いもないし、XMLそのものにまつわる問題は何も違わない(XQueryだって空白の扱いはめんどくさい)。

僕はさらに、XSLT 1.0だってfor-eachを使ってプッシュモデルのスタイルシートを書けるのだから、根本的な違いは何もない、と思うのだけど。

逆に、XQueryだって、ユーザー関数を使えば、テンプレートマッチが存在しない事によるデメリットも、十分カバーできると思う。とはいえ、XSLT 1.0から移行するのであれば、当然これが最初の障壁になるはずなのに、これが標準でカバーされていないというのは驚きだ。

XQueryのFLWORなんて実は大したものじゃないんだ、っていうことは、FLWORを実装してみれば分かるだろう。たぶん、境界条件を限定すれば、最適化することは可能なんだと思う。ただ、それはXSLTでも出来るはずだ、というのがMichael Kayが言いたいことなのだろう。

*1:6点になっちゃったうち最後の2点は、Uche Ogbujiの私見だ。