4.4 理解Schema的数据类型

Schema与DTD的最大不同之处在于:Schema提供了强大的数据类型支持,不管是定义XML元素还是定义XML属性,都需要指定数据类型。

Schema不仅内置了丰富的数据类型,而且还允许开发者从内置数据类型派生新的数据类型。开发者也可以自定义数据类型,甚至可以从自定义数据类型派生新的数据类型。从这个角度来看,Schema有点面向对象的味道:因为开发者可以自定义类型,也可以基于已有的类型派生新的类型。不过,Schema里没有对象的概念。

从宏观上来看,Schema支持的数据类型分为两大类:

alt 简单类型:既适合作为XML元素的类型,也适合作为XML属性的类型。

alt 复杂类型:只能作为XML元素的类型。

本章将详细介绍Schema支持的简单类型,下一章将详细介绍各种复杂类型。

仅就简单类型而言,可按图4.1所示进一步细分。

alt

图4.1 Schema支持的简单类型的分类

从图中可以看出,Schema提供的简单类型大致可分为内建类型和自定义类型两大类,内建类型又可分为内建基本类型和内建派生类型两大类,不过这种细节我们无须关心,我们只需记住一点:内建类型可以直接拿来定义元素或属性的数据类型。

除了内建类型之外,Schema还允许自定义类型。从广义的角度来看,所有自定义类型都是由内建类型派生出来的,区别只是派生方式有所不同而已。Schema支持的派生方式大致上有如下3种:

alt 限制:使用<restriction…/>元素为原有类型增加一个或多个额外的约束。

alt 列表:使用<list…/>元素定义。通过这种方式产生的类型也称为列表类型。


alt提示

<list…/>的作用是将单个已有的数据类型扩展成列表类型,就像把DTD中的IDREF扩展成IDREFS,ENTITY扩展成ENTITIES一样。比在DTD中更强大的是,在Schema中可通过<list…/>元素把任何已有的类型(如XYZ)扩展成列表类型(如XYZS)。


alt 联合:使用<union…/>元素定义,用于将多个已有的数据类型联合起来。通过这种方式产生的类型也称为联合类型。

由于<list…/>元素用于将单个已有的类型扩展成列表类型,因此完全可以将一个联合类型扩展成列表类型。类似地,也可使用<union…/>元素联合多个列表类型组合成联合类型。

不仅如此,Schema还允许为已有的列表类型、联合类型增加额外的限制,从而派生新的类型。

不管是由<list…/>派生出来的列表类型,还是由<union…/>派生出来的联合类型,这些类型的值都可包含多个值组件;而内建基本类型、内建派生类型和用户通过限制派生出来的类型,都只能包含单个值组件,因此这些数据类型也统称为原子类型。


alt注意

其实内建派生类型中有3种是列表类型:IDREFS、ENTITIES和NMTOKENS三者都是采用列表方式派生的新类型,这一点需要读者注意。内建派生类型中没有包含联合类型。


仅从上面的介绍来看,Schema的数据类型确实是相当庞大和烦琐的。事实上,掌握了在Schema中定义类型的方法,就至少已经掌握了Schema 70%的内容。由于Schema的所有简单类型都由内置类型派生而来,因此下面先介绍Schema的内置类型。