内容モデルの定義

内容モデルとは、要素の内容が文字列なのか、どんな順序で何回出現するのか、子要素を持つのか、空なのか、それとも任意なのかなどを示す概念です。

XML Schemaでは、DTDよりもさらに詳しく内容モデルを取り決めることができます。

まずはサンプルを見てください。

<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="books">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="book" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="book">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="title" type="xsd:string" />
        <xsd:element name="price" type="xsd:decimal" />
        <xsd:element ref="date" />
        <xsd:element ref="description" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="date">
    <xsd:complexType>
      <xsd:choice>
        <xsd:element name="ad" type="xsd:string" />
        <xsd:element name="gengo" type="xsd:string" />
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="description">
    <xsd:complexType mixed="true">
      <xsd:choice>
        <xsd:element name="em" type="xsd:string"
                     minOccurs="0" maxOccurs="unbounded" />
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

要素の順序を取り決める

要素の順序を取り決めるためには「xsd:sequence」要素を使用します。

「xsd:sequence」要素はその配下の要素(「xsd:element」要素)が順番に出現するように指定しています。上記サンプルでは、「title」「price」「date」「description」要素が順番に記述されなけれならないことを取り決めています。

要素の出現回数を取り決める

要素の出現回数を取り決めるためには「xsd:element」属性のmaxOccures属性、minOccurs属性を使用します。

minOccurs属性は最小登場回数を、maxOccures属性は最大登場回数を指定します。例えば、minOccures属性が0の場合はその要素が任意(登場しなくてもよい)であることを示し、1以上の場合には必須であることを示します。

maxOccurs属性はminOccurs属性よりも等しいか大きくなければなりません。等しい場合、対象要素が必ず指定回数だけ出現しなければならないことを意味します。出現回数の上限を設けたくない場合には、特殊な値としてmaxOccures属性に“unbounded”を指定します。

要素のゆらぎを表現する

XML文書は初めから厳格に取り決められるケースばかりではありません。例えば、最初は別々のXML文書がやりとりされていて、それらの構造について後から統一が図られるといったケースなどの場合、表してる内容は同じでも要素名が異なってしまっていたということは多々あるでしょう。

XML Schemaでは、「xsd:choice」要素を使用して、要素のいずれかが出現するといった、要素のゆらぎを表現することができます。

<xsd:element name="date">
  <xsd:complexType>
    <xsd:choice>
      <xsd:element name="ad" type="xsd:string" />
      <xsd:element name="gengo" type="xsd:string" />
    </xsd:choice>
  </xsd:complexType>
</xsd:element>

上記サンプルでは「ad」要素(西暦)か「gengo」要素(元号)のいずれか1つが出現するように取り決めています。

混合内容とする

要素に子要素と何らかのテキストの両方がある場合、そのテキストは「混合内容」と呼ばれます。

混合内容とするには「xsd:complexType」要素に「mixed」属性を”true”にします。

<xsd:element name="description">
  <xsd:complexType mixed="true">
    <xsd:choice>
      <xsd:element name="em" type="xsd:string"
                   minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
  </xsd:complexType>
</xsd:element>

上記サンプルでは「description」要素が混合内容となります。テキストの中に別の要素(「em」要素)が混ざっていることがわかると思います。また、「xsd:choice」要素が記述されていることに着目してください。「xsd:choice」要素を記述することで、「em」要素はテキストのどの部分に挟まっていても良い、という意味になります。