Index > Relaxng ... div と para 要素が任意の回数出現してよいという制約を記述する方法 →choice を使え
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回以上なんかでも出現していい"という場合の専用記述要素があればよかったのに。
まあそれは、所詮浅はかな素人考えに過ぎないのだろうが。

 Twitter
follow me on Twitter
 Categories