我們已經看過我們用層層嵌套式和非層次式兩種方法定義元素和元素屬性的方法。W3C XML Schema還有第三種設計方法--自定義數據類型,自定義數據類型可以定義我們自己需要的數據類型,它既可以是象PCDATA一樣的簡單類型,也可以是含有多個元素的復雜類型。
在simpleType和complexType元素中給出自定義數據類型的名字,然後定義子元素或者屬性。下面我們將展現如何定義一個長度受限的字符串類型。
例如:假如我們要定義一個名為"nameType",最大長度為32個字符的數據類型。我們可以這樣寫:
<xsd:simpleType name="nameType">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="32"/>
</xsd:restriction>
</xsd:simpleType>
在simpleType元素中定義新的元素的名字,而restriction元素表示這個元素是來源於W3C XMLSchema名域中的"string"類型,並且對這個字符串應用了約束,例如:可以限制該元素能使用的數值。maxLength元素,稱之為"facet",它說明這個自定義數據類型的約束條件是字符串最大長度不超過32。
另外一非常有用的facet是"pattern"元素,它定義一個必須要被匹配的規則表達式。例如:如果不介意"-"標記,我們可以象下面一樣定義一個10個數字ISBN類型:
<xsd:simpleType name="isbnType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{10}"/>
</xsd:restriction>
</xsd:simpleType>
Facets有兩種方法取得一個數據類型(列表和結合體), 我們將在下面的章節討論更深層的內容。
Complex自定義數據類型同我們已經看過simpleType的一樣,首先給了元素名字。
定義使用數據類型和定義類並使用類建立對象是非常相似的。自定義數據類型用於定義元素或者屬性的抽象概念。它所扮演的角色同類在對象扮演的角色相同。
下面是完整的實例:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">
<!-- definition of simple types -->
<xsd:simpleType name="nameType">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="32"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="sinceType">
<xsd:restriction base="xsd:date"/>
</xsd:simpleType>
<xsd:simpleType name="descType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="isbnType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{10}"/>
</xsd:restriction>
</xsd:simpleType>
<!-- definition of complex types -->
<xsd:complexType name="characterType">
<xsd:sequence>
<xsd:element name="name" type="nameType"/>
<xsd:element name="friend-of" type="nameType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="since" type="sinceType"/>
<xsd:element name="qualification" type="descType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bookType">
<xsd:sequence>
<xsd:element name="title" type="nameType"/>
<xsd:element name="author" type="nameType"/>
<!-- the definition of the "character" element is using the "characterType" complex type -->
<xsd:element name="character" type="characterType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:at