- 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>