choice

2002年10月6日(日)更新


■yomiかkanaのどちらか出現

たけち: 前回はsequenceについて勉強したけれど、今回はそれと並んでよく使うchoiceについて説明するね。まずyomiかkanaのどちらかだけあるスキーマ構造を考えてみよう。

さらら: どちらかだけ?

たけち: うん。次のように
   < poem>
   <kana>熟田津尓 船乗世武登 月待者 ・・・</kana>
   </poem>

 だとか、

   <poem>
   <yomi>熟田津に船乗りせむと月待てば・・・</yomi>
   </poem>

どちらかの形をとるXMLデータだよ。これをDTDで書くと、どうなるんだったっけ?

さらら: えっ、え〜っとね。。 (^ ^; こうかしら。

たけち

■yomiかkanaのどちらかだけあるスキーマ(DTD)
    <!ELEMENT poem (kana | yomi)>
    <!ELEMENT kana (#PCDATA)>
    <!ELEMENT yomi (#PCDATA)>

たけち: そうだね。kana | yomi と書いて、kanaか、またはyomiのどちらか一つが出現するんだよね。これに相当するXML Schemaはこう書けるんだよ。

■yomiかkanaのどちらかだけあるスキーマ(W3C XML Schema)
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poem" type="PoemType"/>

<xsd:complexType name="PoemType">
    <xsd:choice>
    <xsd:element ref="kana" />
    <xsd:element ref="yomi" />
    </xsd:choice>

</xsd:complexType>

<xsd:element name="kana" type="xsd:string" />
<xsd:element name="yomi" type="xsd:string" />

</xsd:schema>

さらら: 要するに前回との違いは、xsd:sequece要素を使っていたのを、代わりにxsd:choiceを使うというだけね。

たけち: そうだね。そしてxsd:sequeceの時と同様に、minOccurs属性maxOccurs属性が使えるんだよ。例えば、


■minOccurs, maxOccursが使えます

■(kana | yomi+) の例(DTD)
    <!ELEMENT poem (kana | yomi+)>
    <!ELEMENT kana (#PCDATA)>
    <!ELEMENT yomi (#PCDATA)>

たけち: のようなDTDだと、XML Schemaは次のように書けるんだよ。

■上記DTDに対応するXML Schema
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poem" type="PoemType"/>

<xsd:complexType name="PoemType">
    <xsd:choice>
    <xsd:element ref="kana" />
    <xsd:element ref="yomi"
maxOccurs="unbounded" />
    </xsd:choice>

</xsd:complexType>

<xsd:element name="kana" type="xsd:string" />
<xsd:element name="yomi" type="xsd:string" />

</xsd:schema>

たけち: このようなスキーマに基づいた具体的なXMLドキュメントは次のようなものになるよね。

    <poem>
    <yomi>熟田津に船乗りせむと月待てば・・・・・<yomi>
    <yomi>神なびの石瀬の社の呼子鳥・・・・・<yomi>
    <yomi>君が行き日長くなりぬ山尋ね・・・・・<yomi>
    </poem>

さらら: そっかぁ〜。なるほどね。

たけち

たけち: じゃ、もうひとつ、次のようなDTDの例を見てみようね。XML Schemaもいっしょに書いておくね。

■(kana | yomi)* の例(DTD)
    <!ELEMENT poem (kana | yomi)*>
    <!ELEMENT kana (#PCDATA)>
    <!ELEMENT yomi (#PCDATA)>

■上記DTDに対応するXML Schema
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poem" type="PoemType"/>

<xsd:complexType name="PoemType">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
    <xsd:element ref="kana" />
    <xsd:element ref="yomi" />
    </xsd:choice>

</xsd:complexType>

<xsd:element name="kana" type="xsd:string" />
<xsd:element name="yomi" type="xsd:string" />

</xsd:schema>

さらら: こんどの例では、choiceのところに、minOccurs, maxOccursを書いているのね。

たけち: こういうスキーマに合致するXMLドキュメントはたとえば次のようになるよね。
    <poem>
    <yomi>熟田津に船乗りせむと月待てば・・・・・</yomi>
    <kana>渡津海乃 豊旗雲尓 伊理比紗之・・・・・</kana>
    <yomi>君が行き日長くなりぬ山尋ね・・・・・</yomi>
    <kana>茜草指 武良前野逝 標野行・・・・・</kana>
    <kana>吾妹子乎 早見濱風 ・・・・・</kana>
    </poem>

さらら: うん。わかるわかる。

たけち: choiceの基本的使い方についてはこれでおしまい。次回はsequeceやchoiceを組み合わせて使うテクニックを勉強しようね。

さらら: えぇ。今回のは分かりやすかったわ。ありがと。

次は、sequenceやchoiceのネストです。 。。。。 (^ ^*

さらら


XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。