使用W3C XML Schema(7)

创建可用——并且可复用的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 >   
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值