Sat, January 3, 2009
Relaxng ... div と para 要素が任意の回数出現してよいという制約を記述する方法 →choice を使え
構造化FrameMaker での XML-Round-Trip のために DTD を自分で書かないといけない。 DTDを書くのは辛すぎるので、RelaxNGを書いてこれを変換してDTDとして使おうと。
今回は、div,para要素が 0回以上任意の回数出現していい、という制約を指定する方法。
XML文書の例
こんなXML文書を許可したい。
<doc>
<para> ... </para>
<div> ... </div>
<div> ... </div>
<div> ... </div>
<para> ... </para>
<div> ... </div>
</doc>
要するに doc 要素内に div,para要素が出現するのだが、何回出現してもよい(0回もOK)というように制約を指定したい場合。
RelaxNGの記述(抜粋)
zeroOrMore と choice を組み合わせて書く。
<element name="doc">
<zeroOrMore>
<choice>
<element name="para">〜省略〜</element>
<element name="div" >〜省略〜</element>
</choice>
</zeroOrMore>
</element>
RelaxNGには interleave という "順序は問わないがグループ中のすべての要素が必ず出現しなければならない" という制約を書くための専用要素を用意しているのだから、 今回のような "ある要素群が0回以上なんかでも出現していい"という場合の専用記述要素があればよかったのに。
まあそれは、所詮浅はかな素人考えに過ぎないのだろうが。