法規XML2.0試案

2.0とかって言うと安っぽく見えるな。文字通りの2.0なんですけど。


六法分書で使っている独自形式のXML "法規XML" は、スキーマ書くつもりで結局書いてないんだけど、大まかな仕様はオケラボブログ:単純法規XMLやその他の記事*1 *2 *3に分散的に記録されているし、あるいはファイル自体がサンプルになっています。
で、この現行バージョンの法規XML(以下「法規XML1.0」と呼ぶ)は色々考えて作った仕様であって、そこにはいろいろと私の哲学が反映されているんですが、哲学を優先して実利がおろそかになったというか、頭でっかちな仕様になっている嫌いがあります。
法規XML1.0では法律の樹構造をそのままXMLの構造に反映させようとした事や、日本語や本文に拘った事から、人*4が読むにはそれなりのメリットはあるものの、XMLのお約束を無視してたりなんだったりで、こいつを扱うプログラムは、特にDOMでやろうとすると、やたら煩雑になってしまうものです。
これは、読者とプログラマでどちらに苦労を配分するかを考えたときにプログラマに負担を課そうという哲学の現れでもありました。


で、それはそれでいいんですけど、プログラマが楽でしかもそれなりに見易いXMLの構造を新たに考えたいかもしれない。
これがどうして必要になるかというと、法務省が提供する法令データから法規XML1.0への変換がかなり面倒いからです。


法規XML1.0の欠点でありしかも哲学の現れであったものの代表は、条文が章・節などの子要素になっている事です。このことは条文の深さが一定しない事を意味します。
また章を章tagで表し節を節tagで表すのですが、これらは実質的には同じものといってもいいです。
また、属性を極力排し、なるだけTextNodeで表現するようにしたせいで、これまた処理が煩雑になりがちでした。このTextNodeを使うという方針はオケラボブログ:OPMLの仕様が気に入らない理由がわかった。で書いたようにCSSでスタイルをつけるためには本文を属性に入れるようなXML言語はダメだろうと思うという理由によるものですが、CSSでの表示を度外視すれば属性を使った方が簡潔になる場合もあります。


というわけで、法規XML2.0では条文を章tag等の子要素にするのをやめてズラズラと並べ、つまり各条と章等はXML Document Tree上は繋がらないようにしようと考えます。
また、tag名や属性名等は英語にしようと考えます。この方がマークアップとコンテキストが見た目にも分離されるかも、というのは後付けの理由であって、本当のところはプログラミング時に全角にするのが面倒だから。
また、章・節等は独立したtagにするのではなく、見出しを意味するより抽象的なtagで、属性としてそれが章である事を示そうと考えます。


で、この見出しをどのようにするかについては2通り考えました。
一つはHTML式。2つめのh1が出ればそこで1つめのh1は終わる、という書き方です。この方式の場合、各条の合間に、見出しが兄弟として現れる事になります。人間が読む場合には新しい見出しは前の見出しの終りを意味する事は自明なので、人間が見るためのフォーマットであるHTML(やTeX)でこの方式をとる事は悪い事ではなかったのかもしれません。私はこの方式が構造化されていないものである事から嫌ってました。
もう一つは、なんだろう。RSSに近いのかな?見出し部分、つまり目次を条文と独立させる方式。で、法規XML2.0ではこっちを使おうかと考えています。コンセプトのサンプルを見た方が早い。

<?xml version="1.0" encoding="utf-8"?>
<act version="2.0">
  <meta>
    <title>◯◯法</title>
  </meta>
  <index>
    <section id="第1章" title="この章のタイトル" from="第1条" to="第3条" /> 
    <section id="第2章" title="この章のタイトル">
      <section id="第1節" title="この節のタイトル" from="第4条" to="第7条" />
      <section id="第2節" title="この節のタイトル" from="第8条" to="第13条" />
    </section>
  </index>
  <content>
    <article id="第1条" title="目的">この法律は法規XML2.0のサンプルとなり健全な社会の育成に死する事を目的とする。</article>
    ...(略)...
  </content>
</act>

つまり、indexを設ける事で、条文のリストには条文のみが含まれるようにします。section.from, section.toの値は該当するarticleのidと一致しなければなりません。また、そのsectionが章である仮説であるか等はXML自体は知りません。ただidによって定義されるに過ぎません。したがって章と節が同じ買いそうになっていたとしてもXML文書としては正しい事になります。
sectionは子sectionを含む場合があります。このとき親sectionにもfromとtoを書くべきかはもうちょっと検討してみます。子sectionから計算可能なものを敢えて書く必要は無いし書かないべきかもしれませんが、子sectionと同じ階層に条文が含まれる場合は子sectionだけからではsectionの正確な範囲が得られないかもしれません。こう書くと何の事やら分かりにくいですが、

第1章
  第1条
  第2条
  第1節
    第3条
    第4条

のような構造を持つ場合、第1章の範囲は1〜4なのに、index/sectionの範囲を子sectionからのみ判断しようとすると3〜4になってしまいかねない、と。このような場合、親sectionにfromを指定する事にすれば良いのかもしれません。プログラム側としては、from,toが指定されていればそれを使い、指定が無ければ子から計算する、と。
あと、タグ名を上の例では英語にしていますが、やっぱ日本語の方が良いかもしれない。ただしidは使う。少なくともタグ名が日本語英語混在というのは好ましくなかろうから、ここはどっちかに統一します。
っていうか英語でも良いんだったらアメリカあたりに既にフォーマットがあるかもしれない。これも調べてみないと。


最後に蛇足。法規XML2.0は見ての通り法規XML1.0のスーパーセットでもなんでもなく、両者は実質的に全く別なフォーマットです。RSS1.0とRSS2.0みたいな。両者は哲学が違うのであって、好みに応じて使い分ければ良いような気がします。
っていうかそんな「哲学の違い」を1人でやってる分裂症の俺様万歳。しかもどっちのフォーマットにせよ、使うのは自分だけだろうて。