- 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.6 minOccursとmaxOccurs
出現回数に関する制限は、minOccursおよびmaxOccurs属性により制限します。
<element 要素の名前 minOccurs="最低出現回数" maxOccurs="最高出現回数">
minOccurs、maxOccursの値は、整数でなくてはいけません。さらに、maxOccursの値は、minOccursの値以上でなくてはいけません。出現回数に上限を持たせない場合は、maxOccursの値をunboundedと指定します。
<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>
上のPurchaseOrderTypeの例で、comment要素を見てください。minOccurs属性が設定されています。属性値は、0に設定されています。これにより、comment要素は最低出現回数が0、つまり、出現してもしなくてもよい要素なのです。ところで、minOccursとmaxOccursのデフォルト値は、両方とも1です。上の例では、shipTo、billTo、itemsはminOccurs、maxOccurs属性が指定されていません。この場合、shipTo、billTo、itemsは必ず1回ずつ出現しなければいけません。
ところで、all要素を指定した場合、maxOccurs、minOccursともに0 か1でなくてはいけません。以下のXML Schemaはエラーになります。
<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" maxOccurs="unbounded"/> <xsd:element name="items" type="po:Items"/> </xsd:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType>
2.7 モデルグループ
子供要素として登場する要素の組があった場合は、モデルグループとして別に定義することができます。モデルグループは、group要素により、定義します。
<group name="モデルグループの名前 "> モデルグループの内容 </group>
group要素の構文は、属性を指定しないことを除けば、Complex Typeの定義と同じです。Complex Type定義内で、モデルグループを参照するときは、ref属性を使用します。
<group ref="モデルグループの名前"/>
例えば、新しくJPAddress型を作成するとします。JPAddress型とはname、street、city要素が共通であった場合、グループ化しておけば、型定義のとき、共通モジュールとして使用できます。
<xsd:complexType name="JPAddress"> <xsd:sequence> <xsd:group ref="po:addressCommon"/> <xsd:element name="prefecture" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="JP"/> </xsd:complexType> <xsd:group name="addressCommon"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> </xsd:sequence> </xsd:group>
以上のように記述することにより、共通の部分をJPAddress型、USAddress型両方で、全く同じ記述をしなくてもよくなります。また、モデルグループの中で別のモデルグループを参照することも可能です。