35
XML ののののののの (2) のの の のの IBM( の ) ののののの / のののの

XML のスキーマ書法 (2)

Embed Size (px)

DESCRIPTION

XML のスキーマ書法 (2). 村田 真 日本 IBM( 株 ) 東京基礎研 / 国際大学. スキーマ言語. DTD, W3C XML Schema, RELAX NG. DTD の制定. W3C が XML 1.0 の一部として制定した SGML ( XML の原型)以来の長い歴史. DTD の構文. 要素型宣言 属性リスト宣言 . DTD の問題点. 独自の奇妙な構文 拡張性の欠如 - PowerPoint PPT Presentation

Citation preview

Page 1: XML のスキーマ書法 (2)

XML のスキーマ書法 (2)

村田 真日本 IBM( 株 ) 東京基礎研 / 国際大学

Page 2: XML のスキーマ書法 (2)

スキーマ言語

DTD, W3C XML Schema, RELAX NG

Page 3: XML のスキーマ書法 (2)

DTD の制定 W3C が XML 1.0 の一部として制定した SGML ( XML の原型)以来の長い歴史

Page 4: XML のスキーマ書法 (2)

DTD の構文 要素型宣言

<!ELEMENT doc (sec*)> 属性リスト宣言

<!ATTLIST doc version CDATA #REQUIREDyear CDATA 1999

>

Page 5: XML のスキーマ書法 (2)

DTD の問題点 独自の奇妙な構文 拡張性の欠如 構文解析がしにくく、ツールが作りに

くい 名前空間が扱えない データ型がない

Page 6: XML のスキーマ書法 (2)

W3C XML Schema の制定 W3C が 2001 年に制定した勧告 Part 0, 1, 2 の三部構成であり、

総計 400 ページ Part 0: 入門 Part 1: 構造 Part 2: データ型

Page 7: XML のスキーマ書法 (2)

主な機構 単純型(データ型) 複合型 = 内容モデル + 属性宣言 継承(三種類) 要素宣言 ( タグ名を型に関連付ける ) 属性宣言 ( 属性名を単純型に関連付け

る ) 名前空間とモジュール化のための機構

Page 8: XML のスキーマ書法 (2)

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)

W3C XML Schema の問題点 きわめて複雑 実装はいくつか存在するが,相互運用

性に問題がある OOXML のスキーマは Microsoft の実装でし

か動かない 基盤となる数学理論がない

Page 10: XML のスキーマ書法 (2)

RELAX NG の制定 OASIS の RELAX NG 技術委員会と ISO/I

EC JTC1 SC34 委員会 ISO/IEC 19757-2

Page 11: XML のスキーマ書法 (2)

木正規文法 文字列言語ではなく木言語を使う スキーマは木正規文法である 生成規則は、 n ::= a < exp > の形である

n非終端記号

a終端記号

exp非終端記号からなる正規表現

XML 文書は sentence である

Page 12: XML のスキーマ書法 (2)

Chomsky 階層

Local

木言語 文字列言語

Regular

Context-Free

Local

Regular

Context-Free

Page 13: XML のスキーマ書法 (2)

木正規言語理論のもたらす利点 木オートマトンによる検証

数学的に厳密 小さな検証器

ブール演算が可能 スキーマの共通集合・和集合・差集合

Page 14: XML のスキーマ書法 (2)

Atom

Page 15: XML のスキーマ書法 (2)

デモ ブログと Atom フィードの例 Atom 使用アプリのデモ(はてな、 Firef

ox )

Page 16: XML のスキーマ書法 (2)

Atom スキーマ RFC 4287

Page 17: XML のスキーマ書法 (2)

Atom のスレッド拡張( RFC 4685) ブログ記事のスレッド、ブログのトラックバックによる関係を示す。

拡張部分 in-reply-to 要素 rel="replies" の atom:link total 要素 thr:count 属性 thr:updated 属性

Page 18: XML のスキーマ書法 (2)

問題点 スレッド拡張のスキーマは、 Atom 本体のスキーマから呼ばれていない。

Atom フィード全体を Atom 本体スキーマに照らして検証しても、拡張部分は検証されない。

Page 19: XML のスキーマ書法 (2)

スキーマのカスタマイズ方法 既存スキーマを直接編集する

既存スキーマが改版されたとき、メンテナンスが困難。

既存スキーマを読み込んだ上で書き換えるスキーマを作る テクニックを要する ( とくに DTD)

Page 20: XML のスキーマ書法 (2)

方法 1: 置き換え 既存スキーマの定義文を、別の定義文

で置き換える。どのスキーマ言語でも利用できる。

Page 21: XML のスキーマ書法 (2)

例include "foo.rnc" {

foo = bar

}

foo.rnc にあった foo の定義文は無視され、こちらの定義が用いられる。

Page 22: XML のスキーマ書法 (2)

方法 2: 組み合わせ 既存スキーマの定義文を生かしつつ、新しい定義文と組み合わせる。 RELAX NG でのみ利用できる。

Page 23: XML のスキーマ書法 (2)

例 1include "foo.rnc"

foo |= bar

}

foo.rnc にあった foo の定義文と、新しい定義文を、 choice (選択)で組み合わせる。

Page 24: XML のスキーマ書法 (2)

例 2include "foo.rnc"

foo &= bar

}

foo.rnc にあった foo の定義文と、新しい定義文を、 interleave (順不同)で組み合わせる。

Page 25: XML のスキーマ書法 (2)

スキーマのスタイル スキーマ書法にはいくつかのスタイル

がある。 どんな単位で定義文を書くかが各スタイルによって異なる。

どのスタイルを採用するかによって、再利用性・保守性・可読性は大きく変わる。

Page 26: XML のスキーマ書法 (2)

有力なスキーマスタイル Russian Doll( 定義文をできるだけ分割

しない ) Salami Slice( 要素・属性が現れると定義文を分割する )

Venetian Blind( 要素・属性の内容が現れると定義文を分割する )

Garden of Eden(Salami Slice と Venetian Blind の混合 )

Page 27: XML のスキーマ書法 (2)

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)

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)

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)

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)

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)

どのスタイルを採用するか(1) Russian Doll

簡明 カスタマイズ困難 冗長性あり

Salami Slice 伝統あるスタイルで、比較的理解しやすい カスタマイズ可能 冗長性あり

Page 33: XML のスキーマ書法 (2)

どのスタイルを採用するか(2) Venetian Blind

比較的理解しにくい カスタマイズ可能 冗長性はさほどない

Garden of Eden 直感的でなく、理解しにくい カスタマイズはきわめて容易 冗長性はない

Page 34: XML のスキーマ書法 (2)

問題 Atom 本来のスキーマをそのまま用いて、 thre

ading 拡張スキーマを呼び出すようにカスタマイズせよ。

Atom 本来のスキーマを拡張しやすいように書き直せ。

書き直したスキーマをカスタマイズして、 threading 拡張スキーマを呼び出せ。

Threading 以外の拡張について、スキーマを作成し、 Atom スキーマ(書き直したもの)をカスタマイズして複数の拡張を同時に呼び出せ。

Page 35: XML のスキーマ書法 (2)

参考文献 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