5.7 抽象元素和抽象类型

Schema允许定义元素或者类型时指定abstract="true",这将导致该元素和类型变成抽象元素和抽象类型。抽象元素和抽象类型都不可以直接在XML文档中使用,在XML文档中必须使用替换元素来替换抽象元素,使用派生类型来替换抽象类型。

5.7.1 抽象元素

前面介绍元素替换时提到:在定义一个全局元素时,它自己并不知道是否会被替换,而且在XML文档中使用该元素时,既可以使用该元素本身,也可以使用该元素的替换元素。

在某些情况下,需要定义一个全局元素以控制它必须被其他元素替换,XML文档也不能直接使用该元素,这需要借助于抽象元素。定义抽象元素只要增加abstract="true"即可,如下所示:

程序清单:codes\05\5.7\abstract_element.xsd

alt

在上面的Schema文档中定义<item…/>元素时指定了abstract="true",这意味着它是一个抽象元素,不可以在XML文档中直接使用该元素,而只能使用它的替换元素来替换它,对于这份Schema文档,如下XML文档是有效的:

程序清单:codes\05\5.7\abstract_element.xml

alt

从上面的介绍可以看出:如果将某个元素定义为抽象元素,通常应该为该元素定义替换元素,否则在XML文档中将无法使用该抽象元素。

5.7.2 抽象类型

如果定义某个类型时指定了abstract="true",即表明该类型是一个抽象类型,XML文档中不可直接使用抽象类型元素。如果希望在XML文档中使用抽象类型的元素,必须为该元素增加xsi:type属性,以指定它是抽象类型的某个派生类型的元素。如下Schema中定义了一个抽象类型:

程序清单:codes\05\5.7\abstract_type.xsd

alt

由于上面的Schema中定义的item_Type是一个抽象类型,因此XML文档中不可以直接使用该类型定义的<item…/>元素。如需使用,必须指定xsi:type属性,如下所示:

程序清单:codes\05\5.7\abstract_type.xml

alt