XML Schema之多文档模式文档继

 

控制对派生类型的创建和使用

 

迄今为止,已经能够不受任何限制地派生类型,同时在实例文档中自由地使用新的派生类型。然后在实际应用中,模式的作者有时候会需要控制从某些特定类型的派生,并且需要控制在实例文档中使用这些派生类型。

 

XML Schema 提供了一组机制来控制类型的派生引出。其中一种机制允许模式的作者来指定特殊的复合类型,新的类型将不可以从这些被指定的复合类型派生,可能是不能通过限制派生、或是不能通过扩展来派生,又或者是所有的方式都不行。 为了显示这点,假设我们想要限制 Address 类型通过约束 (Restriction) 的方式实施派生,因为我们可能打算只将 Address 类型用为扩展类型的基类型,比如 USAddress UKAddress 的基类型都是 Address 类型。为了防止任何类似的非扩展的派生,我们需要稍许修改 Address 类型的原始定义:

<complexType name="Address" final="restriction">
	<sequence>
		<element name="name" type="string" />
		<element name="street" type="string" />
		<element name="city" type="string" />
	</sequence>
</complexType>
 

通过对 final 属性赋以 "restriction" 这个值,能够阻止一切通过约束的派生。 而如果想阻止一切派生或是要阻止通过扩展实施派生,则分别可以通过 final 属性值 "#all" "extension" 来实现。此外,在模式文件的根元素 schema 元素中有一个可选的 finaldefault 属性,它的值能够取为 final 属性所允许的几个值之一。指定 finalDefault 属性的值的效果等于在模式文档中每个类型定义和元素声明中指定 final 属性,同时其值为 finalDefault 属性的值。

 

而另一种类型派生的控制机制则是应用于简单类型方面的类型派生。当定义一个简单类型时,我们可以使用 fixed 属性对它的所有定义参数进行修饰,以阻止这些参数在类型派生中被修改。 举个例子,我们重新定义 postcode 这个简单类型:

<simpleType name="Postcode">
	<restriction base="string">
		<length value="7" fixed="true" />
	</restriction>
</simpleType>
 

当这个简单类型被定义后,能够派生一个新的邮编类型,在其中使用了一个没有在基类型定义中固定的参数:

<simpleType name="UKPostcode">
	<restriction base="ipo:Postcode">
		<pattern value="[A-Z]{2}\d\s\d[A-Z]{2}" />
	</restriction>
</simpleType>
 

然而,不能够派生一个这样的新的邮编类型:在其中重新定义了任何在基类型中已经被固定 (fixed) 的参数 :

<simpleType name="UKPostcode">
	<restriction base="ipo:Postcode">
		<pattern value="[A-Z]{2}\d\d[A-Z]{2}" />
		<!-- illegal attempt to modify facet fixed in base type -->
		<length value="6" fixed="true" />
	</restriction>
</simpleType>
 

除了控制类型派生的机制以外, XML Schema 还提供了一个控制派生类型以及置换组在实例文档中使用的机制,在 P0 实例文档中使用派生类型中我们描述了如何将派生类型 USAddress UKAddress 应用在实例文档中的 shipTo billTo 元素。这些派生类型能够代替 Address 类型提供的内容模型,因为它们都是从 Address 类型派生出来的。然而,被派生类型替换是能够被控制的,具体的说,能够被类型定义中的 block 属性所控制。 举例来说,如果我们想组织任何通过约束而导出的派生类型在 Address 类型出现的地方被使用而替换 Address 类型 ( 也许为了同样的理由我们定义 Address final="restriction" ) ,我们可以修改 Address 的初始定义,并修改为:

<complexType name="Address" block="restriction">
	<sequence>
		<element name="name" type="string" />
		<element name="street" type="string" />
		<element name="city" type="string" />
	</sequence>
</complexType>
 

取值为 "restriction" block 属性将阻止在实例文档中使用通过约束的派生类型来替换 Address 类型。然而,它不会阻止 UKAddress USAddress 来替换 Address ,因为它们是通过扩展而派生的。为了阻止所有的派生类型或者通过扩展而获得的派生类型去替代基类型,可以分别使用值 "#all" "extension" 。和 final 属性一样,在模式文档的根元素 schema 元素里有一个可选的属性 blockDefault ,它的值为 block 属性所允许的值中的一个。 指定 blockDefault 属性的作用等价于在模式文档中为每个类型定义和元素声明指定 block 属性。

 

小结

 

本文主要围绕如何使用多个文档来组成目标的模式而展开讨论。 XML Schema 中为实现这一目标提供了多种机制:包括通过扩展和约束从基类型中派生新的类型;提供重定义机制从而依靠基类型的更新而使派生类型进行更新;利用置换组和抽象定义以及相应的机制来控制元素和类型在实例中的表现。总之, XML Schema 提供了丰富的机制以支持大型的模式的撰写。

 

 

你可能感兴趣的:(xml)