自定义简单类型
对于简单类型,只有限制派生而没有扩展派生。
在概述中,介绍过XML Schema定义了12个面,用于对简单类型的值进行约束。要定义新的简单类型,使用xs:simpleType元素,要对现有的基类型进行限制,使用xs:restiction元素,并在该元素的内部使用限制值范围的面。使用xs:restriction元素的base属性来指定要限制的基类型,或者在xs:restriction元素内部使用xs:simpleType子元素匿名定义一种简单类型,来指定基类型。
一.面
XML Schema推荐标准共定义了12个面,用于约束数据类型的值,这些面如下表所示:
类别 |
面 |
说明 |
范围 |
minInclusive、maxInclusive、minExclusive、maxExculsive |
①分别为<=,>=,<,>;②这四个面只能用于数字、日期和时间类型,以及从这些类型派生的类型 |
长度 |
length、minLength、maxLength |
①这三个面的值必须是非负整数,他们主要用于基于字符串的类型(包括派生类型)、QName和anyURI类型,不能用于日期和事件类型、数字类型,以及boolean类型。②length不能和另外两个一起用。 |
精度 |
totalDigits、fractionDigits |
①totalDigits面的值必须是正整数,它可以应用于decimal类型,或从其派生的类型。②fractionDigits用来限制小数点后的位数。③fractionDigits只能用于decimal类型。 |
枚举 |
enumeration |
此类型可用于除boolean类型外的其他任何类型。 |
模式匹配 |
pattern |
允许我们使用正则表达式来约束某个必须符合指定的样式。例如:<xs:pattern value=”\d{6}”> |
空白处理 |
whitespace |
①用来通知处理器如何处理空白字符。②whitespace有效值为:preserve,replace和collapse,分别对应xs:string,xs:normalizedString和xs:token. |
每个面都有一个必须的属性value。
有必要写个定义简单类型的通用模板,如下:
1. <!--使用base属性指定要限制的基类型-->
<xs:element name="元素名" type="XXXXType"/>
<xs:simpleType name="XXXXType">
<xs:restriction base="内置简单类型">
面限制标签
</xs:restriction>
</xs:simpleType>
2.<!--使用匿名简单类型作为要限制的基类型-->
<xs:element name="元素名" type="XXXXType"/>
<xs:simpleType name="XXXXType">
<xs:restriction>
<!--以下简单类型充当基类型-->
<xs:simpleType>
<xs:restriction base="简单类型">
面限制标签
</xs:restriction>
</xs:simpleType>
面限制标签(对上边的简单类型进一步限制)
</xs:restriction>
</xs:simpleType>
固定面:除enumeration和pattern面外,其余的面都有一个fixed属性,该属性的类型为boolean,默认值为false。若该面的值被固定下来,派生类型将不能修改该免得值。
二.原子类型:
简单类型分为三类:原子类型,列表类型和联合类型。
内置类型和自定义的简单类型都属于原子类型
三.列表类型:
列表类型的值是由原子类型的值组成的列表,各个值之间以空白字符分隔。
NMTOKENS、IDREFS和ENTITIES属于列表类型。
1. 定义列表类型:
要定义新的列表类型,需要使用xs:list元素,该元素的itemType属性用于引用一个现有的原子类型(如例1),或者在xs:list元素内部使用simpleType子元素类指定匿名的原子类型(如例2)。不能使用现有的列表类型来创建新的列表类型,也不能使用复杂类型来创建新的列表类型。
例1:
模式文档:
|
实例文档:
|
例2:
|
2. 限制列表类型:
XML Schema中有5个面可用于列表类型,分别为:length、minLength,maxLength、enumeration和pattern面,要对列表类型进行限制,不能在列表类型定义中直接适用面,而是要先定义列表类型,然后在对该列表类型应用限制。
四.联合类型:
联合类型可以包含多个原子类型或列表类型(甚至是其他的联合类型),组成联合类型的简单类型成为它的成员类型,成员类型必须总是简单类型,不存在复杂类型的联合类型,,联合类型的值可以是他成员类型中的一个类型的实例。
1. 定义联合类型
使用xs:union元素来定义,该元素的memberTypes属性给出组成联合类型的所有成员类型各个成员类型之间以空白符分隔,或者可以在xs:union元素内使用一个或多个xs:simpleType子元素来指定匿名的成员变量。
例如:
(1)使用memberTypes属性:
|
(2)使用simpleType子元素:
略。
2. 限制联合类型:
有两个面是可以应用与联合属性,他们是:enumeration和pattern面,要对联合类型进行限制,不能在联合类型定义中直接适用面,而是要先定义联合类型,然后再对该联合类型应用限制。
五.阻止简单类型的派生:
在xs:simpleType元素上使用final属性,来组织类型派生。其有效值如下:
l #all:表示阻止任何类型(限制、列表和联合)的派生。
l restriction、list、uinon列表,final=“restriction list union”定价于:final=“#all”
l “”:若没有那么它的默认值是xs:schema元素的finalDefault属性的值。
总结还是挺痛苦的,这1000多字写了一个多小时,另外用word写的,搬到这里发现格式还挺丑的。。。