- 2.1 XML Schema サンプル
- 2.2 要素の宣言
- 2.3 Complex Typeの定義
- 2.4 子供要素
- 2.5 sequence, choice, all
- 2.6 minOccursとmaxOccurs
- 2.7 モデルグループ
- 2.8 いろいろなComplex Type
- 2.9 まとめ
2.5 sequence, choice, all
出現する順番に関する制限は、以下の要素を使って指定します。
- sequence
要素の出現の順番を指定します。 - choice
出現する要素のリストを指定します。ここで指定した要素のうちどれか一つが出現します。 - all
出現の順番に関する制限はありません。記述してある要素が任意の順番で、0回もしくは1回、出現します。
それぞれについて、詳しく見ていきたいと思います。出現要素の順番を規定したい場合は、sequence要素を使用します(DTDの要素宣言内で、(要素名1,要素名2,要素名3...)で表されるものです)。構文は以下の通りです。
<complexType name="Complex Typeの名前">
<sequence>
<element 要素1 要素の情報/>
<element 要素2 要素の情報/>
...
</sequence>
</complexType>
以上のように規定すると、子供要素は、sequence要素の中、上から順番に出現します。以下に例を示します。
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="shipTo" type="po:USAddress"/>
<xsd:element name="billTo" type="po:USAddress"/>
<xsd:element ref="po:comment" minOccurs="0"/>
<xsd:element name="items" type="po:Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
上の例では、sequence要素の中で、4つの要素を指定しています。PurchaseOrderTypeの要素は、子供要素として、shipTo、billTo、comment、itemsがこの順番で出現することを示しています。
choiceは出現する要素のリストを指定するものです。(DTDでの要素宣言内で、(要素名1|要素名2|要素3...)と表されるものです)。構文は以下の通りです。
<complexType name=" Complex Typeの名前">
<choice>
<element 要素1 要素の情報/>
<element 要素2 要素の情報/>
...
</choice>
</complexType>
上のように記述すると、choice要素の内容で宣言されている要素のうちひとつだけが出現します。例えば、item要素の中で注文する品物の情報が記述しています。現状では、値段として、USPriceしか記述できませんが、新たにUSPrice、UKPriceどちらかを選択して設定できるようにします。
<item partNum="872-AA">
<productName>Lawnmower</productName>
<quantity>1</quantity>
<UKPrice>103.18</UKPrice>
<comment>Confirm this is electric</comment>
</item>purchaseOrder orderDate="1999-10-20">
このような場合、スキーマは以下のように記述できます。
<xsd:choice>
<xsd:element name="USPrice" type="xsd:decimal"/>
<xsd:element name="UKPrice" type="xsd:decimal"/>
</xsd:choice>
これにより、USPriceかUKPrice、どちらかの要素を記述することになります。
最後がall要素になります。all要素は、子供要素が任意の順番で出現可能な場合に使用します。以下の構文になります。
<complexType name=" Complex Typeの名前">
<all>
<element 要素1 要素の情報/>
<element 要素2 要素の情報/>
...
</all>
</complexType>
以上の例では、all要素の中で宣言/参照されている要素が、すべて1回ずつ出現します。しかし、出現する順番は、任意です。例えば、上のPurcahseOrderTypeの子供要素、shipTo、bilTo、comment、itemsの、出現の順番に関して、特に制限がない場合は、スキーマを以下のように変更します。
<xsd:complexType name="PurchaseOrderType">
<xsd:all>
<xsd:element name="shipTo" type="po:USAddress"/>
<xsd:element name="billTo" type="po:USAddress"/>
<xsd:element ref="po:comment" minOccurs="0"/>
<xsd:element name="items" type="po:Items"/>
</xsd:all>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
すると、以下のXML文書は、正しいものになります。
<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
<items>
...
</items>
<comment>Hurry, my lawn is going wild!</comment>
<shipTo country="US">
...
</shipTo>
<billTo country="US">
...
</billTo>
</purchaseOrder>

