辞書.appのデータ構造の補足
注意: 結論としては補足になっていません。。。RELAX NG
XMLスキーマをここで勉強した際のメモ書き程度になっています
先日書いた辞書.app
の記事ではあまり辞書を作ることに関して調べきれていなかったところがあるので追記します。先日の記事でも単語と意味を登録することはできましたが、MyDictionary.xml
の構造(辞書のデータ構造)について補足していきたいと思います。
MyDictionary.xml
の構造(辞書のデータ構造)
MyDictionary.xml
はRELAX NG
というxml schema言語で記述されています。xml
に明るくないためやや中途半端な説明になりますが、RELAX NG
は外部のデータセットを使用する前提で使われることが大半のようです(参考)
xml
なのでデータを定義するために、簡単な方法を提供してくれているそうです。例えば子要素はelement
、属性はattribute
などがあり、それらに対し1つ以上持つ<oneOrMore>
、つけてもつけなくても<optional>
、どちらか一方だけ<choice>
、などの制約をツリーとして書いていくことができます。私のイメージではタグを定義して作っていく感じです。
まず最初の方の行を見ていきます。
<?xml version="1.0" encoding="UTF-8"?> <d:dictionary xmlns="http://www.w3.org/1999/xhtml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> ... </d:dictionary>
ここでは、2つのネームスペース、xml
とhttp://www.apple.com/DTDs/DictionaryService-1.0.rng
のを宣言しています。またxmlns:d
の部分で、d:
というプレフィックスを宣言しているため、データセットを使用する際は語頭にd:
をつけて使用していくことになります。(ようやくd:entry
などd:
をつけて記述していた意味がわかりました)
続いてデータセットを見てどんな定義があるのかを見ていきます。内容は/Dictionary Development Kit/documents/DictionarySchema/modules/dict-struct.rng
に記載されております。(http://www.apple.com/DTDs/DictionaryService-1.0.rng
はアクセスしても404
でちょっと分かっていません。ネームスペースとしてだけ使っているのでしょうか?)
webで公開されているものもあるので、適宜そちらも参照ください。
まず初めに<grammer>
が全体を囲っていることから、Named patterns
と呼ばれるタグを分割して定義できるようにするパターンで記述していることがわかります(リンク先の セクション4. Named patterns)。
<grammer>
は、1つの<start>
と複数の<define>
を持ちます。<define name="hoge">
と定義したものは、<ref name="hoge">
により参照することができるため、定義を組み合わせて最終的な<start>
を組み立てていく形になります。
ここで定義されている主なものを見てみましょう;
dictionary
<define name="dictionary"> <element name="dictionary" ns="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> <zeroOrMore> <ref name="style"/> </zeroOrMore> <ref name="dictionary.attlist"/> <oneOrMore> <ref name="entry"/> </oneOrMore> </element> </define>
dictionary
の定義は、
- 実態は
dictionary
タグ。アップルのネームスペースを属性として指定している。(ネームスペースの必要性の理解が曖昧です。名前が一般的なので、重複しないようにという慣習的なことでしょうか?それかプレフィックスを共通化するためとか関係している?)- タグは0個以上の
style
を使用できる - タグは1個以上の
entry
を使用できる - タグは
dictionary.attlist
属性リストを使用できるdictionary.attlist
はXTHMLのバージョンと国際化指定を属性として持っているようです
- タグは0個以上の
ref
では参照先がelement
なのかattribute
なのかわからないため、どう表現したら適切か悩みます(おそらく言語で表現しにくいからこそ、この記法が使われているのでしょうが)。
entry
<define name="entry"> <element name="entry" ns="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> <ref name="entry.attlist"/> <zeroOrMore> <ref name="index"/> </zeroOrMore> <ref name="Flow.model"/> </element> </define>
entry
の定義は、
- 実態は
entry
タグ。- 0個以上の
index
が使用可 Flow.model
(なんだこれ。内部にhtml
書けることと関係している?)が使用可entry.attlist
が使用可entry.attlist
はid.attrib
属性が使用可能(<index id="hoge"
とか書ける)parental-control
属性が使用可能(任意)title
属性が使用可能(任意) <- (なぜなくてもいいのだろう?)
- 0個以上の
index
<define name="index"> <element name="index" ns="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> <ref name="index.attlist"/> </element> </define> <define name="index.attlist"> <attribute name="value" ns="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> <text/> </attribute> <optional> <attribute name="title" ns="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> <text/> </attribute> </optional> <optional> <ref name="parental-control.attrib"/> </optional> <optional> <ref name="priority.attrib"/> </optional> <optional> <attribute name="anchor" ns="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> <text/> </attribute> </optional> <optional> <attribute name="yomi" ns="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> <text/> </attribute> </optional> </define>
index
の定義は
- 実態は
index
タグで、属性としてvalue
、オプションの属性としてtitle
、parental-control
、priority
、anchor
、yomi
などが使用可能
といった形になっています。
つまり?
つまり今のところ、そういうデータ構造になっているということがここを読むとわかるようになったというだけのことでした。。。
これらのデータ構造が辞書データとして取り込まれた時に実際どのように扱われるかをみていく必要があり、補足し切れていないです。
データ構造の読み方はわかった、ならばタグとしてどのような形をしているか、その子要素、属性はどのように扱われるか、それらのことを次にまとめていきたいと思います。