XSD 組合型インデクサ

指標を通じて、ドキュメント内で要素を使用する方法を制御できます。

指標

七種の指標があります:

順序指標:

  • すべて
  • 選択
  • シーケンス

出現指標:

  • maxOccurs
  • minOccurs

グループ指標:

  • グループ名
  • attributeGroup name

Order 指示子

Order 指示子は、要素の順序を定義します。

All 指示子

<all> 指示子は、子要素が任意の順序で出現でき、各子要素は一度だけ出現する必要があることを定義します:

<xs:element name="person">
  <xs:complexType>
    <xs:all>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

注記:《all》指示子を使用する場合、<minOccurs> を0または1に設定することができますが、<maxOccurs> 指示子は1に設定する必要があります(後で <minOccurs> と <maxOccurs> について説明します)。

Choice 指示子

<choice> 指示子は、ある子要素または別の子要素(どちらか一方)が出現できることを定義します:

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

ヒント:子要素の出現回数を任意に設定するには、<maxOccurs>(後で説明します)をunbounded(無限回)に設定します。

Sequence 指示子

<sequence> は、子要素が特定の順序で出現する必要があることを定義します:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Occurrence 指示子

Occurrence 指示子は、ある要素がどの程度頻繁に出現するかを定義します。

注記:すべての "Order" と "Group" 指示子(any、all、choice、sequence、group name そして group reference)では、maxOccursおよびminOccursのデフォルト値はすべて1です。

maxOccurs 指示子

<maxOccurs> 指示子は、ある要素がどれだけ多くても出現できるかを定義します:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string"> maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上記の例では、子要素 "child_name" が "person" 要素の中で少なくとも1回(minOccursのデフォルト値は1)、多くとも10回出現することが示されています。

minOccurs 指示子

<minOccurs> 指示子は、ある要素がどれだけ少なくとも出現できるかを定義します:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string">
      maxOccurs="10" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上記の例では、子要素 "child_name" が "person" 要素の中で少なくとも0回、多くとも10回出現することが示されています。

ヒント:ある要素の出現回数を制限せずにするには、maxOccurs="unbounded" という宣言を使用してください:

実際の例:

「Myfamily.xml」と呼ばれるXMLファイル:

<?xml version="1.0" encoding="ISO-8859-1"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
xsi:noNamespaceSchemaLocation="family.xsd">
<person>
<full_name>Tony Smith</full_name>
<child_name>Cecilie</child_name>
</person>
<person>
<full_name>David Smith</full_name>
<child_name>Jogn</child_name>
<child_name>mike</child_name>
<child_name>kyle</child_name>
<child_name>mary</child_name>
</person>
<person>
<full_name>Michael Smith</full_name>
</person>
</persons>

上記のXMLファイルには「persons」というルート要素が含まれています。このルート要素の内部には、3つの「person」要素が定義されています。各「person」要素は「full_name」要素を含む必要があり、最大5つの「child_name」要素を含むことができます。

これはschemaファイル「family.xsd」です:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
elementFormDefault="qualified">
<xs:element name="persons">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="person" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="full_name" type="xs:string"/>
            <xs:element name="child_name" type="xs:string">
            minOccurs="0" maxOccurs="5"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

Group インデクサー

Group インデクサーは、関連する数批要素を定義するために使用されます。

要素グループ

要素グループはgroup宣言で定義されます:

<xs:group name="组名称">
  ...
</xs:group>

group宣言の内部で、all、choice、またはsequence要素を定義する必要があります。以下の例では、"persongroup"という名前のgroupを定義しています。これは、正確な順序で必ず出現する要素グループを定義しています:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

groupを定義した後、他の定義で参照することができます:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>
<xs:element name="person" type="personinfo"/>
<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:group ref="persongroup"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

属性グループ

属性グループはattributeGroup宣言で定義されます:

<xs:attributeGroup name="组名称">
  ...
</xs:attributeGroup>

以下の例では、"personattrgroup"という名前の属性グループを定義しています:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

属性グループを定義した後、他の定義で参照することができます、例えば:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
<xs:element name="person">
  <xs:complexType>
    <xs:attributeGroup ref="personattrgroup"/>
  </xs:complexType>
</xs:element>