XML, XPath, XQuery 講 師 : 福 田 剛 志 fukudat@fukudat.com http://www.fukudat.com/ データベース 設 計 1
文 書 のマークアップの 歴 史 印 刷 組 版 のための 青 鉛 筆 ワープロの 見 た 目 に 関 するコマンド 内 容 と 見 た 目 の 分 離 内 容 をマークアップするための 汎 用 タグ (SGML) 見 た 目 を 制 御 するスタイルシート (DSSSL) WWWの 爆 発 的 普 及 HTML: ハイパーテキストの 表 現 の 一 つ XML: SGMLより 単 純 で,HTMLより 汎 用 W3Cによる 標 準 化 (HTML 1995, XML 1998, XSL 2001) データベース 設 計 2
XML 文 書 の 例 住 所 録 鈴 木 一 郎 ワシントン 州 シアトル 090-1234-5678 ichiro@mariners.com 松 井 秀 喜 ニューヨーク 州 ニューヨーク 090-9876-5432 matsui@yankees.com 松 坂 大 輔 マサチューセッツ 州 ボストン 090-2468-1357 daisuke@redsox.com <?xml version= 1.0?> < 住 所 録 > < 個 人 背 番 号 = 51 > < 名 前 > 鈴 木 一 郎 </ 名 前 > < 住 所 >ワシントン 州 シアトル</ 住 所 > < 電 話 >090-1234-5678</ 電 話 > <メルアド>ichiro@mariners.com</メルアド> </ 個 人 > < 個 人 背 番 号 = 55 > < 名 前 > 松 井 秀 喜 </ 名 前 > < 住 所 >ニューヨーク 州 ニューヨーク</ 住 所 > < 電 話 >090-9876-5432</ 電 話 > <メルアド>matsui@yankees.com</メルアド> </ 個 人 > < 個 人 背 番 号 = 18 > < 名 前 > 松 坂 大 輔 </ 名 前 > < 住 所 >マサチューセッツ 州 ボストン</ 住 所 > < 電 話 >090-2468-1357</ 電 話 > <メルアド>daisuke@redsox.com</メルアド> </ 個 人 > </ 住 所 録 > データベース 設 計 3
XML 文 書 の 構 造 <?xml version= 1.0?> < 住 所 録 > < 個 人 背 番 号 = 51 > < 名 前 > 鈴 木 一 郎 </ 名 前 > < 住 所 >ワシントン 州 シアトル</ 住 所 > < 電 話 >090-1234-5678</ 電 話 > <メルアド>ichiro@mariners.com</メルアド> </ 個 人 > < 個 人 背 番 号 = 55 > < 名 前 > 松 井 秀 喜 </ 名 前 > < 住 所 >ニューヨーク 州 ニューヨーク</ 住 所 > < 電 話 >090-9876-5432</ 電 話 > <メルアド>matsui@yankees.com</メルアド> </ 個 人 > < 個 人 背 番 号 = 18 > < 名 前 > 松 坂 大 輔 </ 名 前 > < 住 所 >マサチューセッツ 州 ボストン</ 住 所 > < 電 話 >090-2468-1357</ 電 話 > <メルアド>daisuke@redsox.com</メルアド> </ 個 人 > </ 住 所 録 > 個 人 背 番 号 51 名 前 鈴 木 一 郎 住 所 ワシントン 州 シアトル 住 所 録 個 人 電 話 090-1234- 5678 個 人 メルアド ichiro@ mariners. com データベース 設 計 4
XML 言 語 の 構 成 要 素 要 素 (element) < 要 素 名 > と </ 要 素 名 > で 囲 む. 要 素 は 入 れ 子 にできる. 属 性 (attribute) 属 性 名 = 属 性 値 要 素 に 付 加 的 な 情 報 をつける. 先 頭 にXML 宣 言 <?xml version= バージョン 番 号?> ルート 要 素 がひとつ XML 文 書 にはスキーマがあってもよい スキーマとは,どういう 要 素 をどういう 順 番 で 使 ってよいかを 定 めた 規 則 DTD (Document Type Definition), XML Schema, RelaxNG Cf. リレーショナル スキーマ = テーブルにどのようなカラムがあるか 定 めた 規 則 データベース 設 計 5
XMLの 特 徴 データの 近 くに,データの 説 明 ( 要 素 名, 属 性 名 )があ る= 自 己 記 述 的 例 ) < 住 所 >ワシントン 州 シアトル</ 住 所 > 要 素 が 入 れ 子 にできるので, 階 層 構 造 が 表 現 できる. 要 素 の 順 序 は 重 要 ( 文 書 なので) 要 素 の 有 無, 出 現 回 数, 順 序 に 自 由 度 を 持 たせるこ とができる. 半 構 造 データ (semi-structured data) Cf. リレーション = フラットな 表 入 れ 子 は 許 されない すべての 行 は 同 じ 属 性 ( 要 素 )を 持 つ だから 毎 回 記 述 しない 行 の 順 序 は 考 慮 しない データベース 設 計 6
文 書 型 定 義 (Document Type Definition; DTD) XML 文 書 のデータ 構 造 を 定 義 する 許 される 要 素 とその 順 序, 回 数 などを 規 定 なくてもよい <!DOCTYPE ルート 要 素 [ で 始 まり ]> で 終 わる 要 素 型 宣 言 <!ELEMENT 要 素 名 構 成 要 素 > 構 成 要 素 の 種 類 EMPTY: それ 以 上 の 子 要 素 がない ANY: その 下 位 に 任 意 の 構 造 を 許 す 子 要 素 の 正 規 表 現 例 ) <!ELEMENT 個 人 ( 名 前, ( 住 所 電 話 メルアド)*)> #PCDATA: 文 字 列 データ 属 性 リスト 宣 言 <!ATTLIST 要 素 名 属 性 名 属 性 値 の 候 補 または 型 デフォルト 値 > 例 ) <!ATTLIST 名 前 背 番 号 CDATA #IMPLIED> エンティティ 宣 言 <!ENTITY % 名 前 定 義 > <!ENTITY 名 前 定 義 > データベース 設 計 7
DTDの 例 <?xml version= 1.0?> < 住 所 録 > < 個 人 背 番 号 = 51 > < 名 前 > 鈴 木 一 郎 </ 名 前 > < 住 所 >ワシントン 州 シアトル</ 住 所 > < 電 話 >090-1234-5678</ 電 話 > <メルアド>ichiro@mariners.com</メルアド> </ 個 人 > < 個 人 背 番 号 = 55 > < 名 前 > 松 井 秀 喜 </ 名 前 > < 住 所 >ニューヨーク 州 ニューヨーク</ 住 所 > < 電 話 >090-9876-5432</ 電 話 > <メルアド>matsui@yankees.com</メルアド> </ 個 人 > < 個 人 背 番 号 = 18 > < 名 前 > 松 坂 大 輔 </ 名 前 > < 住 所 >マサチューセッツ 州 ボストン</ 住 所 > < 電 話 >090-2468-1357</ 電 話 > <メルアド>daisuke@redsox.com</メルアド> </ 個 人 > </ 住 所 録 > <!DOCTYPE 住 所 録 [ <!ELEMENT 住 所 録 ( 個 人 *)> <!ELEMENT 個 人 ( 名 前, ( 住 所 電 話 メルアド)*)> <!ELEMENT 名 前 (#PCDATA)> <!ATTLIST 名 前 背 番 号 CDATA #IMPLIED> <!ELEMENT 住 所 (#PCDATA)> <!ELEMENT 電 話 (#PCDATA)> <!ELEMENT メルアド (#PCDATA)> ]> データベース 設 計 8
データベースの 歴 史 初 期 のデータベースは 明 示 的 な ナビゲーショ ン が 必 要 であった 1980 年 ごろからほとんどのビジネスデータは リレーショナルとなった データは 一 様 な 行 と 列 を 持 つテーブルに 入 る. データには 固 有 の 順 序 はない アクセスパスは 自 動 的 に 最 適 化 される 標 準 問 合 せ 言 語 : SQL SELECT price * qty FROM parts WHERE name = "Bolt" PARTS NAME PRICE QTY Bolt 0.75 300 Nut 0.12 300 データベース 設 計 9
データと 文 書 の 収 束 WWWの 発 展 がビジネスデータの 新 しい 要 件 を 生 んだ 注 文 書, 治 療 記 録, 保 険 記 録 など 多 くのデータは 文 書 の 性 質 を 持 つ 固 有 の 順 序 がある 多 様 (すべてのインスタンスは 異 なる) まばら (sparse) 階 層 的 (hierarchical) データベースは 自 己 記 述 的 なデータ 形 式 が 必 要 XMLは 自 明 な 選 択 メタデータが タグ としてデータと 混 在 する すべての 主 要 なデータベースベンダーはXMLに 投 資 している データベース 設 計 10
XPath 2.0 XMLに 対 する 問 い 合 わせ 言 語 XML 文 書 内 の 一 部 を 指 し 示 す 手 段 XSLT 2.0 XML 文 書 を 変 換 する 言 語 XQuery 1.0 XML 文 書 に 対 する 問 い 合 わせ 言 語 XSLT と XQuery は データモデル 関 数 ライブラリ 型 システム ナビゲーション (XPath) を 共 有 する XML Schema XQuery XPath 2.0 XSLT データベース 設 計 11
XML 文 書 内 の 一 部 を 指 し 示 す 手 段 ファイルシステムの path と 似 ている. : 文 脈 ノード 自 身.. : 文 脈 ノードの 親 ノード XPath あるノード( 文 脈 ノード)に 注 目 して,そこから 指 定 された 道 筋 (path)で 到 達 で きる 要 素 を 指 し 示 す 道 筋 の 一 歩 一 歩 = Location Step 既 存 のものを 指 し 示 すことができるが, 新 しく 何 かを 作 ることができない Location Step = 軸 + ノード 検 査 + 述 語 軸 は7 種 類 child, attribute, descendant, ancestor, ancestor-or-self, descendant-or-self, self ノード 検 査 はノードの 名 前, 種 類 を 指 定 する 述 語 は 条 件 式 または 要 素 番 号 XPath 式 の 値 は 文 書 中 のノードのリスト 例 えば /company[@location= Machida ]/employee[secretary]/language[1] データベース 設 計 12
XPathの 例 child::xxx は, 文 脈 ノードの 子 xxx 要 素 child::* は, 文 脈 ノードの 子 要 素 すべて child::text() は, 文 脈 ノードの 子 テキストノードすべて child::node() は,そのノード 型 を 問 わず, 文 脈 ノードの 子 すべて attribute::name は, 文 脈 ノードの name 属 性 attribute::* は, 文 脈 ノードの 属 性 すべて descendant::xxx は, 文 脈 ノードの 子 孫 xxx 要 素 ancestor::xxx は, 文 脈 ノードの 祖 先 xxx すべて ancestor-or-self::xxx は, 文 脈 ノードの 祖 先 xxx,および 文 脈 ノード が xxx 要 素 である 場 合 にはその 文 脈 ノードも, 選 択 する. descendant-or-self::xxx は, 文 脈 ノードの 子 孫 xxx,および 文 脈 ノードが xxx 要 素 である 場 合 にはその 文 脈 ノードも, 選 択 する. self::xxx は, 文 脈 ノードが xxx 要 素 である 場 合 には 文 脈 ノードを 選 択 し,そうでない 場 合 には 何 も 選 択 しない. child::xxx/descendant::yyy は, 文 脈 ノードの 子 xxx 要 素 の 子 孫 yyy 要 素 child::*/child::xxx は, 文 脈 ノードの 孫 xxx すべて / は, 文 書 ルート /descendant::xxx は, 文 脈 ノードと 同 じ 文 書 にある xxx 要 素 すべて /descendant::xxx/child::yyy は, 文 脈 ノードと 同 じ 文 書 にある, 親 に xxx をもつ yyy 要 素 すべて child::xxx[position()=1] は, 文 脈 ノードの 最 初 の 子 xxx child::xxx[position()=last()] は, 文 脈 ノードの 最 後 の 子 xxx child::xxx[position()=last()-1] は, 文 脈 ノードの, 最 後 から 二 番 目 の 子 xxx child::xxx[position()>1] は, 文 脈 ノードの 最 初 の 子 xxx 以 外 の, 文 脈 ノードの 子 xxx すべて following-sibling::xxx[position()=1] は, 文 脈 ノードの 次 の 兄 弟 xxx 要 素 preceding-sibling::xxx[position()=1] は, 文 脈 ノードの 前 の 兄 弟 xxx 要 素 /descendant::xxx[position()=42] は, 文 書 の42 番 目 の xxx 要 素 /child::xxx/child::yyy[position()=5]/child::zzz[position()=2] は, xxx 要 素 の5 番 目 の yyy の2 番 目 の zzz child::xxx[attribute::aaa="warning"] は, 文 脈 ノードの 子 xxx で, aaa 属 性 に warning という 値 をとるものすべて child::xxx[attribute::aaa= warning ][position()=5] は, 文 脈 ノード の 子 xxx で aaa 属 性 に warning という 値 をとるうち5 番 目 のもの child::xxx[position()=5][attribute::aaa= warning ] は, 文 脈 ノード の5 番 目 の 子 xxx で aaa 属 性 に warning という 値 をとるもの child::xxx[child::yyy='introduction'] は, 文 脈 ノードの 子 xxx で, 文 字 列 値 が Introduction に 等 しい 子 yyy を1 個 以 上 もつもの child::xxx[child::yyy] は, 文 脈 ノードの 子 xxx で,1 個 以 上 の 子 yyy をもつもの child::*[self::xxx or self::yyy] は, 文 脈 ノードの 子 xxx および 子 yyy child::*[self::xxx or self::yyy][position()=last()] は, 文 脈 ノードの 子 xxx または yyy のうち 最 後 のもの データベース 設 計 13
Bool 式 (Boolean Expression) book[author = Mark Twain ] 数 式 (Numeric Expression) chapter[2] 存 在 検 査 (Existence Test) book[appendix] person[married] XPathの 述 語 3 種 類 これらの3 種 類 のどれなのかを 静 的 には 区 別 できないことがある 静 的 には 区 別 できない = 実 行 してみないと 判 らないということ 最 適 化 を 難 しくしている データベース 設 計 14
なるべく 型 を 少 なく XPath 1.0の 設 計 思 想 Boolean, String, Number, Node Set なるべくエラーで 止 まらない(なんとか 処 理 を 進 める) 自 動 的 な 型 変 換 を 行 う 結 果, 暗 黙 の 動 作 が 増 えてしまった 単 一 の 値 が 必 要 なところにリストが 来 たら 最 初 の 要 素 を 使 う 必 要 ならばノードを 値 に 変 換 比 較 は 存 在 限 定 されている(existentially quantified) bonus > salary という 式 の 意 味 は, b bonus, s salary such that ( number(b) > number(s) ) データベース 設 計 15
XSLT (Extensible Stylesheet Language Transformations) XML 文 書 の 変 換 を 記 述 する 言 語 XSLT 自 身 もXMLで 表 現 される サブ 言 語 として XPath を 使 用 している XSLT による 変 換 Source tree Result tree データベース 設 計 16
<?xml version="1.0" encoding="shift_jis"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="shift_jis"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="page"> <HTML> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <xsl:template match="employees"> <xsl:apply-templates/> </xsl:template> <xsl:template match="employee"> <xsl:value-of select="ename"/><br/> </xsl:template> </xsl:stylesheet> XSLTの 例 PAGE というタグが 来 たら, <HTML><BODY> と </BODY></HTML> というタグを 出 力,その 間 にテンプレートを 繰 り 返 し 適 用 した 結 果 を 含 める. EMPLOYEES というタグが 来 たら, またテンプレートを 繰 り 返 し 適 用 す る. EMPLOYEE というタグが 来 たら, その 下 の ENAME というタグの 値 と <BR/> を 出 力 する データベース 設 計 17
XQueryの 誕 生 QL 98 国 際 会 議 (Boston) 約 50 個 の XML 問 い 合 わせ 言 語 の 提 案 があった XML Query Working Group W3C により 1999 年 に 設 立 約 30 社 から 代 表 が 参 加 QL 98 の 提 案 を 調 査 し, 新 しい 提 案 を 作 成 同 時 に SQL の 拡 張 という 選 択 も 検 討 その 結 果, 新 言 語 XQuery を 開 発 することを 決 定 データベース 設 計 18
クロージャー ( 閉 包 ) XQueryの 設 計 原 理 データモデルに 対 する 操 作 がそのデータモデル 内 で 閉 じてい る (Cf. 有 理 数 と 四 則 演 算 ) 構 成 的 XQueryは( 数 種 類 の) 式 の 組 み 合 わせでできている 式 には 副 作 用 がない 式 を 組 み 合 わせて 式 が 作 られる 既 存 のXML 標 準 との 互 換 性 を 考 慮 XML Schema の 型 システム XML Namespace の 名 前 付 け 規 則 XPath によるナビゲーション データベース 設 計 19
XQuery Data Model (XDM) XML 文 書 (Linear Text) 構 文 解 析 妥 当 性 検 証 による 型 の 付 与 (オプション) 直 列 化 XQuery XDM インスタンス (Nodes & Atomic Values) データベース 設 計 20
XML 文 書 の 例 <?xml version = "1.0"?> <!-- Requires one trained person --> <procedure title = "Removing a light bulb"> <time unit = "sec">15</time> <step>grip bulb.</step> <step> Rotate it <warning>slowly</warning> counterclockwise. </step> </procedure>
と,その XDM による 表 現 D C procedure E A title="removing a light bulb" time E A unit="sec" E step E step T T T E warning T 15 Grip bulb. Rotate it counterclockwise. T slowly
XQueryの 構 文 例 繰 り 返 し: for $x in expr1 return expr2 条 件 分 岐 : if (test) then expr1 else expr2 存 在 限 定 : some $x in expr1 satisfies test2 全 量 限 定 : every $x in expr1 satisfies test2 集 合 演 算 : union, intersect, except コンストラクター: <greeting>hello</greeting> <revenue>{ $price * $quantity }</revenue> データベース 設 計 23
XQueryの 例 入 力 文 書 parts.xml <part> <partno>101</partno> <name> 車 輪 </name> <color> 赤 </color> </part> <part> <partno>102</partno> <name>ギア</name> <color> 緑 </color> </part> 入 力 文 書 orders.xml <order> <date>2007-11-23</date> <partno>101</partno> </order> <order> <date>2007-12-24</date> <partno>101</partno> </order> データベース 設 計 24
問 い 合 わせ: XQueryの 例 (つづき) 赤 い 色 の 部 品 (part)で, 少 なくとも10 件 以 上 のオーダーのあるものの 名 前 とオーダー 数 を 求 めよ 出 力 結 果 の 例 <popular-red-part> <name> 車 輪 </name> <orders>95</orders> </popular-red-part> <popular-red-part> <name>タンク</name> <orders>123</orders> </popular-red-part> データベース 設 計 25
問 い 合 わせ: XQueryの 例 (つづき) 赤 い 色 の 部 品 (part)で, 少 なくとも10 件 以 上 のオーダーのあ るものの 名 前 とオーダー 数 を 求 めよ for $p in fn:doc( parts.xml )//part[color= 赤 ] let $o := fn:doc( order.xml )//order[partno = $p/partno] where fn:count($o) >= 10 return <popular-red-part> { $p/name } <orders>{ fn:count($o) }</orders> </popular-red-part> FLWR (フラワー) と 表 現 される For Let Where Return データベース 設 計 26
Groupingできない XQueryの 問 題 Cf. SQL の group by に 相 当 する 機 能 がない Updateができない 変 換 はできるが, 元 のデータを 変 更 できない Cf. SQL では insert 文,update 文, delete 文 で 変 更 できた 次 のバージョンでは 改 善 される 予 定 データベース 設 計 27
Saxon: XQuery 処 理 系 の 例 http://saxon.sourceforge.net/ AltovaXML: http://www.altova.com/altovaxml.html DataDirect XQuery: http://www.datadirect.com/products/xquery/ データベース 設 計 28