XSD 複合元素

什麼是複合元素

  • 空元素
    • <product pid="1345"/>
  • 包含其他元素的元素

    • <employee>
          <firstname>John</firstname>
          <lastname>Smith</lastname>
      </employee> 
  • 僅包含文本的元素
    • <food type="dessert">Ice cream</food>
  • 包含元素和文本的元素

    • <description>
          It happened on <date lang="norwegian">03.03.99</date> ....
      </description>

定義複合元素

  1. 直接在元素中複合元素

    • <sequence>中,意味着子元素必須以它們被聲明的次序出現
    • <xs:element name="employee">
          <xs:complexType>
              <xs:sequence>
                  <xs:element name="firstname" type="xs:string"/>
                  <xs:element name="lastname" type="xs:string"/>
              </xs:sequence>
          </xs:complexType>
      </xs:element>
  2. 使用type屬性,引用要使用類型的名稱

    • <sequence>中,意味着子元素必須以它們被聲明的次序出現
    • <xs:element name="employee" type="personinfo"/>
      <xs:complexType name="personinfo">
        <xs:sequence>
          <xs:element name="firstname" type="xs:string"/>
          <xs:element name="lastname" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>

  • 在已有的複合元素定義新的複合元素
  • <xs:element name="employee" type="fullpersoninfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="fullpersoninfo">
      <xs:complexContent>
        <xs:extension base="personinfo">
          <xs:sequence>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>

空元素
  • 空元素<product prodid="1345" />
  • 限定空元素,實際上不聲明任何元素即可,下面的例子只聲明瞭一個屬性

    • <xs:element name="product">
        <xs:complexType>
          <xs:complexContent>
            <xs:restriction base="xs:integer">
              <xs:attribute name="prodid" type="xs:positiveInteger"/>
            </xs:restriction>
          </xs:complexContent>
        </xs:complexType>
      </xs:element>

    在上面的例子中,我們定義了一個帶有複合內容的複合類型。complexContent 元素給出的信號是,我們打算限定或者拓展某個複合類型的內容模型,而 integer 限定則聲明瞭一個屬性但不會引入任何的元素內容。

    • 更加緊湊的寫法

      • <xs:element name="product">
          <xs:complexType>
            <xs:attribute name="prodid" type="xs:positiveInteger"/>
          </xs:complexType>
        </xs:element>
    • 或者您可以爲一個 complexType 元素起一個名字,然後爲 “product” 元素設置一個 type 屬性並引用這個 complexType 名稱(通過使用此方法,若干個元素均可引用相同的複合類型)。

      • <xs:element name="product" type="prodtype"/>
        
        <xs:complexType name="prodtype">
          <xs:attribute name="prodid" type="xs:positiveInteger"/>
        </xs:complexType>

僅含元素
  • 僅含元素

    • <person>
          <firstname>John</firstname>
          <lastname>Smith</lastname>
      </person>
  • 限定僅含元素

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

    請留意這個 <xs:sequence>。它意味着被定義的元素必須按上面的次序出現在 “person” 元素中。

    • 或者您可以爲 complexType 元素設定一個名稱,並讓 “person” 元素的 type 屬性來引用此名稱(如使用此方法,若干元素均可引用相同的複合類型):

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

僅含文本
  • 僅含文本<shoesize country="france">35</shoesize>
  • 限定僅含文本

    • <xs:element name="shoesize">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:integer">
              <xs:attribute name="country" type="xs:string" />
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>

    請使用 extension 或 restriction 元素來擴展或限制元素的基本簡易類型。
    聲明瞭一個複合類型,其內容被定義爲整數值,並且 “shoesize” 元素含有名爲 “country” 的屬性

    • 我們也可爲 complexType 元素設定一個名稱,並讓 “shoesize” 元素的 type 屬性來引用此名稱(通過使用此方法,若干元素均可引用相同的複合類型):

      • <xs:element name="shoesize" type="shoetype"/>
        
        <xs:complexType name="shoetype">
          <xs:simpleContent>
            <xs:extension base="xs:integer">
              <xs:attribute name="country" type="xs:string" />
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>

包含元素和文本元素
  • 混合元素

    • <letter>
      Dear Mr.<name>John Smith</name>.
      Your order <orderid>1032</orderid>
      will be shipped on <shipdate>2001-07-13</shipdate>.
      </letter>
  • 限定混合元素

    • <xs:element name="letter">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="orderid" type="xs:positiveInteger"/>
            <xs:element name="shipdate" type="xs:date"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

    爲了使字符數據可以出現在 “letter” 的子元素之間,mixed 屬性必須被設置爲 “true”。 標籤 (name、orderid 以及 shipdate ) 意味着被定義的元素必須依次出現在 “letter” 元素內部。

    • 我們也可以爲 complexType 元素起一個名字,並讓 “letter” 元素的 type 屬性引用 complexType 的這個名稱(通過這個方法,若干元素均可引用同一個複合類型)
    • <xs:element name="letter" type="lettertype"/>
      
      <xs:complexType name="lettertype" mixed="true">
        <xs:sequence>
          <xs:element name="name" type="xs:string"/>
          <xs:element name="orderid" type="xs:positiveInteger"/>
          <xs:element name="shipdate" type="xs:date"/>
        </xs:sequence>
      </xs:complexType>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章