5.5 通配符

在某些情况下,如果无法确定指定元素还需要包含哪些子元素、哪些属性,可以使用通配符。Schema支持使用<any…/>元素作为元素通配符,使用<anyAttribute…/>元素作为属性通配符。

5.5.1 元素通配符

Schema中使用<any…/>元素作为元素通配符,<any…/>元素可以代表任何元素。也就是说,<any…/>元素出现的位置可以使用任何元素代替。

<any…/>元素可接受如下几个属性:

alt id:指定该元素的唯一标识,通常无须指定。

alt maxOccurs:指定该通配符所代表的元素最多可以出现的次数,该属性值可以是任何非负整数或"unbounded"字符串。

alt minOccurs:指定该通配符所代表的元素最少可以出现的次数,该属性值可以是任何非负整数。

alt namespace:指定可代替该元素通配符的元素必须来自哪个空间,该属性可接受如下属性值:

● ##any:来自任何命名空间的元素都可以代替该元素通配符。

● ##other:来自该元素的父元素的目标命名空间之外的其他命名空间的元素才可代替该元素通配符。

● ##local:无命名空间限定的元素可代替该元素通配符。

● ##targetNamespace:来自该元素的父元素的目标命名空间的元素才可代替该元素通配符。

● 命名空间URI:只有来自该命名空间的元素才可代替该元素通配符。

● 上面多个值的列表:值列表中的任意一个所对应命名空间的元素都可。

alt processContents:指定应用程序或XML处理器如何对替换元素进行验证。如果没有指定processContents属性,则默认为strict。如果指定了processContents属性,则其值必须是以下值之一:

● strict:XML处理器必须获得所需命名空间(由namespace指定)对应的Schema,并验证来自该命名空间的所有元素。

● lax:XML处理器试图获得所需命名空间(由namespace指定)对应的Schema,如果获得了该Schema,则验证来自该命名空间的所有元素;即使没有获得该Schema,也不会发生任何错误。

● skip:XML处理器不会去获取所需命名空间,也不会进行任何验证。当然,替换元素依然必须来自namespace属性所指定的命名空间。

如下Schema示范了<any…/>元素里namespace属性的作用:

程序清单:codes\05\5.5\any_namespace.xsd

alt

下面再定义一个目标命名空间为http://www.crazyit.org/schema的Schema:

程序清单:codes\05\5.5\crazyit.xsd

alt

对于上面两份Schema,如下XML文档是有效的:

程序清单:codes\05\5.5\any_namespace.xml

alt

通过上面的Schema文档可以很容易地看出<any…/>元素里namespace属性的作用。

如下Schema文档则示范了processContents属性的作用:

程序清单:codes\05\5.5\any_processContents.xsd

alt

上面的Schema中使用<any…/>元素指定了一个元素通配符,并为该<any…/>元素指定了processContents="skip",故而不会访问替换元素所在的Schema,也不会进行任何验证。因此如下XML文档是有效的:

程序清单:codes\05\5.5\any_processContents.xml

alt

从上面的XML文档中可以看出,在<book…/>元素下定义了一个<crazyit:test…/>子元素,尽管crazyit前缀对应的Schema根本不存在,但该文档依然是一份有效的XML文档。

5.5.2 属性通配符

属性通配符与元素通配符的用法基本相似,只是定义属性通配符使用<anyAttribute…/>元素,而且由于同一个元素下不能包含同名属性,因此<anyAttribute…/>元素不能指定minOccurs和maxOccurs两个属性。<anyAttribute…/>元素中的id、namespace和processContents属性与<any…/>元素中的相应属性意义完全相同。

如下Schema示范了属性通配符的用法:

程序清单:codes\05\5.5\anyAttribute_processContents.xsd

alt

上面的Schema中使用<anyAttribute…/>元素为<book…/>元素定义了一个属性通配符,表明<book…/>元素可以接受来自http://www.crazyit.org命名空间下的任何属性。而且定义该属性通配符时还指定了processContents="skip",表明XML处理器将完全不理会http://www.crazyit.org命名空间对应的Schema,因此如下XML文档是有效的:

程序清单:codes\05\5.5\anyAttribute_processContents.xml

alt