xml のスキーマ書法 (2)
DESCRIPTION
XML のスキーマ書法 (2). 村田 真 日本 IBM( 株 ) 東京基礎研 / 国際大学. スキーマ言語. DTD, W3C XML Schema, RELAX NG. DTD の制定. W3C が XML 1.0 の一部として制定した SGML ( XML の原型)以来の長い歴史. DTD の構文. 要素型宣言 属性リスト宣言 . DTD の問題点. 独自の奇妙な構文 拡張性の欠如 - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/1.jpg)
XML のスキーマ書法 (2)
村田 真日本 IBM( 株 ) 東京基礎研 / 国際大学
![Page 2: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/2.jpg)
スキーマ言語
DTD, W3C XML Schema, RELAX NG
![Page 3: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/3.jpg)
DTD の制定 W3C が XML 1.0 の一部として制定した SGML ( XML の原型)以来の長い歴史
![Page 4: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/4.jpg)
DTD の構文 要素型宣言
<!ELEMENT doc (sec*)> 属性リスト宣言
<!ATTLIST doc version CDATA #REQUIREDyear CDATA 1999
>
![Page 5: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/5.jpg)
DTD の問題点 独自の奇妙な構文 拡張性の欠如 構文解析がしにくく、ツールが作りに
くい 名前空間が扱えない データ型がない
![Page 6: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/6.jpg)
W3C XML Schema の制定 W3C が 2001 年に制定した勧告 Part 0, 1, 2 の三部構成であり、
総計 400 ページ Part 0: 入門 Part 1: 構造 Part 2: データ型
![Page 7: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/7.jpg)
主な機構 単純型(データ型) 複合型 = 内容モデル + 属性宣言 継承(三種類) 要素宣言 ( タグ名を型に関連付ける ) 属性宣言 ( 属性名を単純型に関連付け
る ) 名前空間とモジュール化のための機構
![Page 8: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/8.jpg)
W3C XML Schema の複合型
<xsd:complexType name="Address" ><xsd:sequence> <xsd:element name="city" type="xsd:string" /> <xsd:element name="zip" type="xsd:decimal"/>
</xsd:sequence><xsd:attribute name="country" type="xsd:NMTOKEN "
use="fixed " value="US"/></xsd:complexType>
![Page 9: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/9.jpg)
W3C XML Schema の問題点 きわめて複雑 実装はいくつか存在するが,相互運用
性に問題がある OOXML のスキーマは Microsoft の実装でし
か動かない 基盤となる数学理論がない
![Page 10: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/10.jpg)
RELAX NG の制定 OASIS の RELAX NG 技術委員会と ISO/I
EC JTC1 SC34 委員会 ISO/IEC 19757-2
![Page 11: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/11.jpg)
木正規文法 文字列言語ではなく木言語を使う スキーマは木正規文法である 生成規則は、 n ::= a < exp > の形である
n非終端記号
a終端記号
exp非終端記号からなる正規表現
XML 文書は sentence である
![Page 12: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/12.jpg)
Chomsky 階層
Local
木言語 文字列言語
Regular
Context-Free
Local
Regular
Context-Free
![Page 13: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/13.jpg)
木正規言語理論のもたらす利点 木オートマトンによる検証
数学的に厳密 小さな検証器
ブール演算が可能 スキーマの共通集合・和集合・差集合
![Page 14: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/14.jpg)
Atom
![Page 15: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/15.jpg)
デモ ブログと Atom フィードの例 Atom 使用アプリのデモ(はてな、 Firef
ox )
![Page 16: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/16.jpg)
Atom スキーマ RFC 4287
![Page 17: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/17.jpg)
Atom のスレッド拡張( RFC 4685) ブログ記事のスレッド、ブログのトラックバックによる関係を示す。
拡張部分 in-reply-to 要素 rel="replies" の atom:link total 要素 thr:count 属性 thr:updated 属性
![Page 18: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/18.jpg)
問題点 スレッド拡張のスキーマは、 Atom 本体のスキーマから呼ばれていない。
Atom フィード全体を Atom 本体スキーマに照らして検証しても、拡張部分は検証されない。
![Page 19: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/19.jpg)
スキーマのカスタマイズ方法 既存スキーマを直接編集する
既存スキーマが改版されたとき、メンテナンスが困難。
既存スキーマを読み込んだ上で書き換えるスキーマを作る テクニックを要する ( とくに DTD)
![Page 20: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/20.jpg)
方法 1: 置き換え 既存スキーマの定義文を、別の定義文
で置き換える。どのスキーマ言語でも利用できる。
![Page 21: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/21.jpg)
例include "foo.rnc" {
foo = bar
}
foo.rnc にあった foo の定義文は無視され、こちらの定義が用いられる。
![Page 22: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/22.jpg)
方法 2: 組み合わせ 既存スキーマの定義文を生かしつつ、新しい定義文と組み合わせる。 RELAX NG でのみ利用できる。
![Page 23: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/23.jpg)
例 1include "foo.rnc"
foo |= bar
}
foo.rnc にあった foo の定義文と、新しい定義文を、 choice (選択)で組み合わせる。
![Page 24: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/24.jpg)
例 2include "foo.rnc"
foo &= bar
}
foo.rnc にあった foo の定義文と、新しい定義文を、 interleave (順不同)で組み合わせる。
![Page 25: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/25.jpg)
スキーマのスタイル スキーマ書法にはいくつかのスタイル
がある。 どんな単位で定義文を書くかが各スタイルによって異なる。
どのスタイルを採用するかによって、再利用性・保守性・可読性は大きく変わる。
![Page 26: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/26.jpg)
有力なスキーマスタイル Russian Doll( 定義文をできるだけ分割
しない ) Salami Slice( 要素・属性が現れると定義文を分割する )
Venetian Blind( 要素・属性の内容が現れると定義文を分割する )
Garden of Eden(Salami Slice と Venetian Blind の混合 )
![Page 27: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/27.jpg)
XML 文書例 <foo>
<bar> <baz1>1</baz1> <baz2>2</baz2> <baz3>3</baz3> </bar> <sat> <baz1>1</baz1> <baz2>2</baz2> <baz3>3</baz3> </sat> <mas> <baz1>1</baz1> <baz2>2</baz2> <baz3>3</baz3> </mas></foo>
![Page 28: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/28.jpg)
Russian Doll トップレベルでは、要素定義がひとつだけ存在する。他の定義
は、すべてそのなかに埋め込まれる。 default namespace = ""
start = element foo { element bar { element baz1 { xsd:integer }, element baz2 { xsd:integer }, element baz3 { xsd:integer } }, element sat { element baz1 { xsd:integer }, element baz2 { xsd:integer }, element baz3 { xsd:integer } }, element mas { element baz1 { xsd:integer }, element baz2 { xsd:integer }, element baz3 { xsd:integer } } }
![Page 29: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/29.jpg)
Salami Slice 要素定義を用い、内容定義は用いない。要素定義に
内容定義を埋め込む。 default namespace = ""
start = element foo { bar, sat, mas }bar = element bar { baz1, baz2, baz3 }sat = element sat { baz1, baz2, baz3 }mas = element mas { baz1, baz2, baz3 }baz1 = element baz1 { xsd:integer }baz2 = element baz2 { xsd:integer }baz3 = element baz3 { xsd:integer }
SGML時代からの伝統に基づいたスキーマ (Docbook, TEI, XHTML2 など ) では、 Salami Slice を原則として採用している。
![Page 30: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/30.jpg)
Venetian Blind 内容定義を用い、要素定義は用いない。内容定義に
要素定義を埋め込む。 default namespace = ""
start = element foo {foo.content}foo.content = element bar { bsm.content }, element sat { bsm.content }, element mas { bsm.content }bsm.content = element baz1 { xsd:integer }, element baz2 { xsd:integer },
element baz3 { xsd:integer } 最近のスキーマでは Venetian Blind を採用して
いるものがある。
![Page 31: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/31.jpg)
Garden of Eden 要素定義と内容定義の両方を用いる。要素定義には内
容定義を埋め込まない。 default namespace = ""
start = element foo {foo.content}foo.content = bar, sat, masbar = element bar { bsm.content }sat = element sat { bsm.content }mas = element mas { bsm.content }bsm.content = baz1, baz2, baz3baz1 = element baz1 { xsd:integer }baz2 = element baz2 { xsd:integer }baz3 = element baz3 { xsd:integer }
最近のスキーマでは Garden of Eden を採用しているものがある (Universal Business Language など )。
![Page 32: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/32.jpg)
どのスタイルを採用するか(1) Russian Doll
簡明 カスタマイズ困難 冗長性あり
Salami Slice 伝統あるスタイルで、比較的理解しやすい カスタマイズ可能 冗長性あり
![Page 33: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/33.jpg)
どのスタイルを採用するか(2) Venetian Blind
比較的理解しにくい カスタマイズ可能 冗長性はさほどない
Garden of Eden 直感的でなく、理解しにくい カスタマイズはきわめて容易 冗長性はない
![Page 34: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/34.jpg)
問題 Atom 本来のスキーマをそのまま用いて、 thre
ading 拡張スキーマを呼び出すようにカスタマイズせよ。
Atom 本来のスキーマを拡張しやすいように書き直せ。
書き直したスキーマをカスタマイズして、 threading 拡張スキーマを呼び出せ。
Threading 以外の拡張について、スキーマを作成し、 Atom スキーマ(書き直したもの)をカスタマイズして複数の拡張を同時に呼び出せ。
![Page 35: XML のスキーマ書法 (2)](https://reader036.vdocuments.mx/reader036/viewer/2022081501/568130e7550346895d9702a0/html5/thumbnails/35.jpg)
参考文献 Atom 解説 , http://www.witha.jp/Atom/ Bob DuCharme, “Your schema and the i
ndustry-standard schema”, http://www.idealliance.org/proceedings/xml05/abstracts/paper30.HTML
RELAX NG 入門、http://www.kohsuke.org/relaxng/tutorial.ja.html