您的位置:首页 > 其它

使用W3C XML Schema(7)

2008-03-31 14:33 429 查看
创建可用——并且可复用的Schema

或许编写可复用的schema的第一步是文档化它们。W3C XML Schema 提供了一个XML注释(面向人的)的替代品,以及处理说明(面向机器),可能为支持工具更易于处理。

人类可读的文档可以用xs:documentation元素定义,而针对应用程序则必须包括在xs:appinfo元素内。它们都必须包含在xs:annotation元素内,并且接受可选的xml:lang以及source属性和任意的内容类型。source属性是一个URI引用,可被用来说明说明注释文档的目的或应用程序信息。

xs:annotation元素可以被添加到大多数schema结构的开始处,就如下面的例子那样。appinfo部分演示了如何自定义名称空间和schema可能允许在schema内部一个元素绑定到一个Java类。

<xs:element name="book">
<xs:annotation>
<xs:documentation xml:lang="en">
Top level element.
</xs:documentation>
<xs:documentation xml:lang="fr">
Element racine.
</xs:documentation>
<xs:appinfo source="http://example.com/foo/">
<bind xmlns="http://example.com/bar/">
<class name="Book"/>
</bind>
</xs:appinfo>
</xs:annotation>

从多个文件组合Schema

对那些希望将一个schema定义在多个文档的人来说——要么切分一个大的schema,要么使用schema代码段的库——W3C XML Schema 提供两种机制来包含外部的schema。

第一种包含机制,xs:include类似于复制并粘贴包含的schema的定义。它是一个包含文件并且它不允许覆盖被包含schema的定义。它可以这样使用:

<xs:include schemaLocation="character.xsd"/>

第二种包含机制,xs:redefine,类似于xs:include,除了它会要求你从包含的schema中重新定义声明。

<xs:redefine schemaLocation="character12.xsd">
<xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<xs:maxLength value="40"/>
</xs:restriction>
</xs:simpleType>
</xs:redefine>

注意,被重定义的声明必须放在xs:redefine元素中。

我们已经看到了很多特性,它们可以被一起使用,通过xs:include和xs:redefine去创建schema的库。我们看到了如何引用之前定义好的元素,如何通过派生定义数据类型并使用它们,如何定义并使用属性组,我们还看到元素好对象的对比、数据类型和类的对比。这里还有另外一个从面向对象设计借过来的特性,就是可以创建可复用的schema。

抽象类型

这些特性中的第一个,从面向对象设计演变而来的,是替代组。不像我们迄今看到的那些特性,一个替代组不是通过W3C XML Schema元素明确定义的,而是通过引用一个公用的元素(称为head)使用substitutionGroup。

头元素并不包含任何特定的声明,但必须为全局的。所有的元素在一个替代组内需要有一个类型,要么和头元素同一个类型或者可以从它派生。那么,他们都可以代替头元素使用。在下面的例子中,surname元素可以在name元素被定义的任何地方使用。

<xs:element name="name" type="xs:string"/>
<xs:element name="surname" type="xs:string"
substitutionGroup="name" />

现在,我们也可以定义一个一般的name-elt 元素,它为一个替代组的头元素,其不应直接被使用,而应该使用其的一个派生形式。这是通过声明该元素为抽象的实现的,类似于面向对象语言中的一个抽象类。下面的例子定义了name-elt为抽象元素,它应该被在引用的地方使用name或surname替代。

<xs:element name="name-elt" type="xs:string" abstract="true"/>
<xs:element name="name" type="xs:string"
substitutionGroup="name-elt"/>
<xs:element name="surname" type="xs:string"
substitutionGroup="name-elt"/>

最终类型

我们可以,或者另一个方面,希望控制数据类型上的派生。 W3C XML Schema 通过xs:complexType、xs:simpleType或者xs:element上的final属性支持这点。这个属性的值范围为:restriction, extension 以及#al,通过约束现在扩展或派生。下面的片段代码,举例说明,禁止从characterType 复杂类型的任何派生。

<xs:complexType name="characterType" final="#all">
<xs:sequence>
<xs:element name="name" type="nameType"/>
<xs:element name="since" type="sinceType"/>
<xs:element name="qualification" type="descType"/>
</xs:sequence>
</xs:complexType>

除final外,一个更细粒度的机制是控制简单类型的派生,作用在每个切面(facet)上。这里,这个属性叫做fixed,当它的值设为true的时候,切面(facet)不能进行修改(但其他的切换仍可被增加和修改)。下面的例子防止类型nameType被重定义:

<xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<xs:maxLength value="32" fixed="true"/>
</xs:restriction>
</xs:simpleType>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: