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の有無、パフォーマンス、型チェックの厳密さ)を把握した上で選定・設計することが重要です。
参考文献
- W3C: XQuery 1.0 and XPath 2.0 Formal Semantics / XQuery 1.0: An XML Query Language
- W3C: XQuery 3.0: An XML Query Language
- W3C: XQuery 3.1: An XML Query Language
- W3C: XQuery Update Facility 1.0
- W3C: XPath 3.1
- BaseX — XML Database and XQuery Processor
- eXist-db — Open Source Native XML Database
- Saxonica (Saxon) — XSLT, XQuery, XPath implementations


