4.8 使用<union…/>派生联合类型
Schema允许使用<union…/>元素将多个简单类型联合成新的类型,通过<union…/>元素派生出来的新的类型称为联合类型。
使用<union…/>元素创建联合类型时,需要指定一个到多个简单类型,为<union…/>元素指定简单类型有两种方式:
为<union…/>元素的memberTypes属性指定一个到多个简单类型,多个简单类型之间以空格隔开。
为<union…/>元素增加一个到多个<simpleType…/>子元素,每个<simpleType…/>子元素指定一个简单类型。
组成联合类型的数据类型称为联合类型的成员类型,任意数量的原子类型或列表类型都可作为联合类型的成员类型。
联合类型的值可以是任意一种成员类型的值。
如下Schema使用<union…/>元素定义了一个联合类型:
程序清单:codes\04\4.8\union.xsd
上面定义的联合类型定义了<price_name…/>元素,该类型包括price_Type和publish_date_Type两个成员类型,因此<price_name…/>元素的值既可以是price_Type类型,也可以是publish_date_Type类型。如下XML文档是有效的:
程序清单:codes\04\4.8\union.xml
前面使用<union…/>元素时通过memberTypes属性指定了多个成员类型。除此之外,该元素也可以接受多个<simpleType…/>子元素,每个子元素用于指定一个成员类型。也就是说,上面的Schema文档可以改为如下形式:
程序清单:codes\04\4.8\union2.xsd
4.8.1 限制联合类型
联合类型同样可通过添加约束来派生新的联合类型,Schema允许为联合类型增加如下两类约束:
枚举约束:enumeration。
正则表达式约束:pattern。
与前面介绍的限制列表类型相似,为联合类型添加的约束是对整个联合类型的值起作用。如下Schema文档定义了一个union_constraint_Type类型,用于对原有的price_publish_Type类型增加enumeration约束:
程序清单:codes\04\4.8\union_constraint.xsd
对于上面定义的Schema而言,其中的<price_name…/>元素的值必须是12.7、23.4和2008-12-12三者之一,而且这3个值都是price_publish_Type类型的值。