5.9 元素组与属性组
Schema也提供了元素组支持,相比于DTD中的元素组,Schema里的元素组具有更好的可复用性:Schema中的元素组可定义成命名的顶级元素组,因此可以多次重复使用该元素组。Schema使用<group…/>元素来定义和使用元素组。
类似地,Schema也允许将多个属性组合成一个命名的顶级属性组,这样就可以在多个元素中重复使用该属性组。Schema使用<attributeGroup…/>元素来定义和使用属性组。
不管是元素组还是属性组,都是用来简化Schema配置、提高代码可复用性的一种手段。如果开发者不考虑Schema代码的简洁性和易维护性,完全可以不使用元素组和属性组。
定义元素组使用<group…/>元素,组内的元素有其自身的逻辑关系,其逻辑关系有如下3种:
有顺序的元素关系:使用<sequence…/>元素定义。
互斥的元素关系:使用<choice…/>元素定义。
无顺序的元素关系:使用<all…/>元素定义。
下面是使用<group…/>元素建立元素组的示例Schema:
程序清单:codes\05\5.9\group.xsd
在上面的Schema定义中可以看到,如果希望使用分组,可以采用如下的语法格式:
通过这种方式,可以将多个固定出现的元素定义成元素组,从而方便在多个地方引用。
实际上,当我们在Schema中使用<group…/>元素定义一个顶级元素组之后,使用该元素组与使用单个元素并没有太大的区别——只是每次使用该元素组都将同时引用多个元素。因此当我们在<group…/>元素中指定ref属性引用另一个已有的元素组时,也可以指定minOccurs和maxOccurs属性。
对于上面的Schema,如下XML文档是有效的:
程序清单:codes\05\5.9\group.xml
属性组与元素组的作用类似,主要用来将多个经常出现的属性定义成固定组,方便在多个地方引用。定义属性组使用<attributeGroup…/>元素,其语法格式如下:
使用属性组也是使用attributeGroup标签,其语法格式如下:
看下面的Schema定义:
程序清单:codes\05\5.9\attributeGroup.xsd
对于上面的Schema文档,如下XML文档是有效的:
程序清单:codes\05\5.9\attributeGroup.xml
由上面的介绍可以看出,当我们在Schema中将多个元素和多个属性分别定义成元素组和属性组之后,Schema可在多个地方重复引用这些元素组和属性组,即使这些地方的元素和属性定义需要修改,开发者无须修改它们,而只需修改元素组和属性组定义即可。