定义命名类型
我们已经看到,当我们需要他们时,我们可以定义元素和属性,首先创建并引用它们(目录)。 W3C XML Schema 给我们第3 个机制, 将确定数据类型(用于PCDATA元素的简单类型或者属性或者仅用于元素的复杂类型)使用这种类型去定义我们的属性和元素。
这是通过给simpleType 和complexType 元素命名实现的,并且在元素和属性定义之外定位它们。我们也会借此机会,以显示我们如何通过在数据类型上定义约束新建一个数据类型。
例如,要定义一个名为nameType的数据类型,其为最大32个字符的字符串,我们会这样写:
< xs:restriction base ="xs:string" >
< xs:maxLength value ="32" />
</ xs:restriction >
</ xs:simpleType >
simpleType 元素中的name属性值为新数据类型的名称。restriction 元素表示通过应用一个约束,该数据类型源自于W3C XML Schema 名称空间(基础属性)的数据类型。例如,通过现在可能值的数字。这个maxLength 元素,即所谓的facet,说明这个约束是一个最大长度为32字符的约束条件。
另外一个功能强大的facet是pattern元素,它定义了一个必须匹配的正则表达式。例如,如果我们不关心“-”字符,我们可以定义ISBN数据类型为10个数字,因此:
< xs:restriction base ="xs:string" >
< xs:pattern value ="[0-9]{10}" />
</ xs:restriction >
</ xs:simpleType >
Facets,以及另外两种方式生成一个数据类型(list和union)将在下面的章节介绍。
复杂类型就像我们之前看到的那样被定义,仅仅给一个名称。
定义并且使用命名的数据类型与定义一个类兵器使用它实例化一个对象相似。一种数据类型是一个抽象的概念,可用于定义一个属性或匀速。datatype和属性以及元素的关系类似于类和对象的关系。
完整清单:
< xs:schema xmlns:xs ="http://www.w3.org/2001/XMLSchema" >
<!-- definition of simple types -->
< xs:simpleType name ="nameType" >
< xs:restriction base ="xs:string" >
< xs:maxLength value ="32" />
</ xs:restriction >
</ xs:simpleType >
< xs:simpleType name ="sinceType" >
< xs:restriction base ="xs:date" />
</ xs:simpleType >
< xs:simpleType name ="descType" >
< xs:restriction base ="xs:string" />
</ xs:simpleType >
< xs:simpleType name ="isbnType" >
< xs:restriction base ="xs:string" >
< xs:pattern value ="[0-9]{10}" />
</ xs:restriction >
</ xs:simpleType >
<!-- definition of complex types -->
< xs:complexType name ="characterType" >
< xs:sequence >
< xs:element name ="name" type ="nameType" />
< xs:element name ="friend-of" type ="nameType" minOccurs ="0"
maxOccurs ="unbounded" />
< xs:element name ="since" type ="sinceType" />
< xs:element name ="qualification" type ="descType" />
</ xs:sequence >
</ xs:complexType >
< xs:complexType name ="bookType" >
< xs:sequence >
< xs:element name ="title" type ="nameType" />
< xs:element name ="author" type ="nameType" />
< xs:element name ="character" type ="characterType" minOccurs ="0" />
<!-- the definition of the "character" element is
using the "characterType" complex type -->
</ xs:sequence >
< xs:attribute name ="isbn" type ="isbnType" use ="required" />
</ xs:complexType >
<!-- Reference to "bookType" to define the
"book" element -->
< xs:element name ="book" type ="bookType" />
</ xs:schema >
下面讲的是分组、排序以及衍生如何用来实现进一步的复用以及介绍scheme的结构。