XQuery完全ガイド:XMLとJSONの横断処理を実現するFLWOR・XDM・3.1機能解説

はじめに — XQueryとは何か

XQuery(エックスクエリ)は、XMLデータを検索・抽出・変換するために設計された宣言型のクエリ言語です。W3C(World Wide Web Consortium)によって標準化され、XPath を基盤に持ち、XMLのノード構造を直接扱える点が特徴です。データベースやXML文書の処理、WebサービスやETLパイプライン、近年ではJSONとの相互運用機能を持つことで、汎用的なデータ処理言語として使われています。

基本概念と設計思想

XQueryは「XML Data Model(XDM)」を中心に設計され、XMLドキュメントのノード(要素、属性、テキスト、コメント等)と原子値(文字列、数値、ブール値等)を一貫して扱います。言語的には、XPathのパス式・関数・演算子を拡張したもので、FLWOR式(For, Let, Where, Order by, Return)などの構文を使い、関数ベースの処理や再帰的な処理も可能です。

  • 宣言型・関数型寄り:処理の「何を取得するか」を記述するスタイル。
  • ノード指向:DOMのようなノード概念でXMLを扱う。
  • 型システム:XML Schema(XSD)に基づく型付けをサポート。
  • 副作用が基本的にない:データの読み取り・生成が中心。変更は別仕様(Update Facility)を使う。

歴史とバージョン

XQueryはW3C標準として段階的に進化してきました。主な節目は次のとおりです。

  • XQuery 1.0(W3C Recommendation, 2007年):XPath 2.0と合わせた形で勧告化され、XMLクエリの基礎仕様となりました。
  • XQuery Update Facility 1.0(2011年に勧告化):XQueryに対してノードの挿入・削除など更新を可能にする拡張仕様。
  • XQuery 3.0(2014年):関数を第一級オブジェクトとして扱う、モジュール化、逐次処理向けの機能強化などを導入。
  • XQuery 3.1(2017年):JSONサポート(map/array型・JSONシリアライズ等)や関数型プログラミング強化が追加され、XMLとJSONを横断する処理が容易になりました。

主要な構文と例(FLWOR、パス式、関数)

ここでは典型的なクエリの例を示します。サンプルXML(books.xml)を想定:

<books>
  <book id="b1">
    <title>A Tale of Two Cities</title>
    <author>Charles Dickens</author>
    <price>9.99</price>
  </book>
  <book id="b2">
    <title>Programming in XQuery</title>
    <author>A. Developer</author>
    <price>29.90</price>
  </book>
</books>

例:価格が10未満の書籍のタイトルをアルファベット順に取得(FLWOR)

for $b in doc("books.xml")/books/book
where xs:decimal($b/price) < 10
order by $b/title
return $b/title

パス式の例:ルートからauthorノードだけ取り出す場合

doc("books.xml")/books/book/author

関数の定義と使用(XQuery 3.0以降)

declare function local:discount($price as xs:decimal) as xs:decimal {
  round-half-to-even($price * 0.9, 2)
};

for $b in doc("books.xml")/books/book
return
  <book id="{data($b/@id)}">
    <title>{data($b/title)}</title>
    <discounted>{local:discount(xs:decimal($b/price))}</discounted>
  </book>

XQuery Data Model(XDM)と型システム

XDMはXQueryとXPathの基盤で、ノードと原子値を一貫して扱います。主なポイント:

  • ノードの種類:ドキュメントノード、要素ノード、属性ノード、テキストノード、コメント、処理命令など。
  • 原子値:xs:string、xs:integerなど、XML Schemaの型を継承。
  • シーケンス:XQueryでは結果は常に「シーケンス」で返る(0個以上の項目の並び)。
  • 型注釈:関数の引数・戻り値に型を付けることが可能で、型チェックを活用できる(実装による型チェックの強さは異なる)。

JSONサポートとXQuery 3.1の拡張

XQuery 3.1ではmap型、array型の導入、JSONのシリアライズ/パース関数が加わり、XMLだけでなくJSONを第一級に扱えるようになりました。これにより、XMLとJSONが混在する環境(Web APIやNoSQLと連携する場面)での利用がぐっと現実的になっています。

更新(Update)機能について

標準のXQueryは基本的に副作用を持たない(読み取り・生成)言語ですが、ノードの変更を行いたい場合は「XQuery Update Facility」という拡張仕様が提供されています。Update Facilityを使うと、insert、delete、replace、rename などで既存ドキュメントを変更できます。ただし、更新は実装や環境(データベース、トランザクション対応)に依存する要素が多い点に注意が必要です。

主な実装と運用例

代表的な実装例:

  • BaseX — 高速で軽量なXMLデータベース。XQuery 3.1をサポートし、REST/HTTP経由での利用が可能。
  • eXist-db — オープンソースのXMLデータベース。XQueryベースでWebアプリと連携しやすい。
  • Saxon(Saxonica) — XSLT/XPath/XQueryを実装する広く使われる製品。Saxon-HE/PE/EEのエディションにより機能差(Updateや商用サポートなど)。
  • その他 — 実験的プロジェクトや古い実装(例:Zorbaは活動が止まっている)など。

主な利用シーン:

  • XMLデータベースでの高速検索・集計。
  • XML文書の部分抽出や変換(レポーティングやデータ統合)。
  • Webサービスのレスポンス加工、ETL処理、AJAX/REST APIとの橋渡し(特にXQuery 3.1のJSONサポートで有利)。

SQLやXSLT、XPathとの比較

  • SQL:表形式データに最適化された宣言型言語。XMLの階層構造を直接表現するのは苦手。XMLDBではSQL/XMLやXQueryの両方が提供されることがある。
  • XSLT:XMLの変換に特化した言語。テンプレートとマッチングベースでの処理が得意。XQueryはクエリ/抽出に重きを置き、FLWORのような集合指向の記述が読みやすい場面がある。
  • XPath:XQueryの一部(パス式、関数)。XQueryはXPathを拡張し、完全なプログラミング的表現力を持つ。

実践的なコツとベストプラクティス

  • FLWORを適切に使う:for/letでデータを束ね、whereで絞り込み、order byで並び替え、returnで結果を生成する。処理の意図が明確に。
  • 関数とモジュール化:再利用可能な関数をdeclareしておくと可読性・保守性が向上。
  • 型を活用する:可能ならXSD型を使って早期にエラーを検出する。実装によっては型チェックが厳密で効率化にも寄与する。
  • 更新は慎重に:Update Facilityの操作はデータ整合性やトランザクションに注意。バックアップやトランザクション対応を確認する。
  • JSONとの連携:APIやフロントエンド連携でJSONを扱う場合はXQuery 3.1のmap/arrayとシリアライズ関数を利用すると効率的。

まとめ

XQueryはXMLを中心としたデータ操作で高い表現力を持つクエリ言語です。XPathを土台に、FLWORや関数、モジュール化、そしてXDMという一貫したデータモデルにより、複雑な階層データの検索・変換を簡潔に表現できます。XQuery 3.1でJSONサポートが加わったことで、XML/JSON混在環境でも有効に機能します。運用にあたっては実装ごとの機能差(Updateの有無、パフォーマンス、型チェックの厳密さ)を把握した上で選定・設計することが重要です。

参考文献