達人出版会日記

ITエンジニア向けの技術系電子書籍の制作と販売を行う達人出版会のブログです。

OPF2.0とNCXのスキーマをRELAX NG Compact Syntaxにしてみる

XHTMLやOPFなど、特定のフォーマットのXMLファイルを構文的に定義するには、スキーマというものが使われます。OPFの場合、こんなところ(附録A)に書かれているのがスキーマです。

スキーマを記述するためには、スキーマ言語なるものが使われます。このスキーマ言語にもいくつか種類があるのですが、OPFはRELAX NGというスキーマ言語が使われています。これは、村田真さんとJames Clarkさんが作ったスキーマ言語で、詳しく(XML Schemaと比較してどうだとか)説明すると大変なことになるのですが、まあ「よくわかってる人が作ったスキーマ記述言語」とだけおぼえておけば安心です。

さてこのRELAX NGですが、ふつうはXMLを使って書かれます。実際、OPF 2.0の仕様書でも、XMLになってますね。ですが、実はRELAX NGにはCompact Syntaxというのがあり、こちらを使えば、BNFに毛の生えたような記法でスキーマを記述することができます。

まあ、何を言ってるのか分からない人は、「OPF 2.0の定義は実はもっとわかりやすくシンプルに書ける」とだけ覚えて下さい。

というわけで実際に変換してみました。結果は以下です。

さらに、NCXのcompact syntax版も作ってみました。こちらは、epubcheckのソースにあった、NCXのRELAX NGスキーマを元にしています。

ずいぶんとすっきりした形に書けるようになるのがわかると思います。

……とはいえ、RELAX NG compact syntaxを知らない人には微妙に説明しづらいのと、RELAX NGはさておきcomapct syntaxも知っている人は少なさそうなんですよねえ……少し検索してみた感じでも、DTDXML Schemaも知らない人向けのcompact syntaxの説明をしてくれてそうなものは見つかりませんでしたし。ううむ。とりあえずDTDを知っている人は、この辺を参考にするとよいかと。