使用W3C XML Schema(2)

分组,排序和派生

分组

W3C XML Schema 亦允许元素和属性的分组定义。

<!--  definition of an element group  -->  

< xs:group  name ="mainBookElements" >  
< xs:sequence >  
< xs:element  name ="title"  type ="nameType" />  
< xs:element  name ="author"  type ="nameType" />  
</ xs:sequence >  
</ xs:group >  

<!--  definition of an attribute group  -->  
< xs:attributeGroup  name ="bookAttributes" >  
< xs:attribute  name ="isbn"  type ="isbnType"  use ="required" />  
< xs:attribute  name ="available"  type ="xs:string" />  
</ xs:attributeGroup >  


这些分组可以被用于复杂类型的定义,如下:

< xs:complexType  name ="bookType" >  
< xs:sequence >  
< xs:group  ref ="mainBookElements" />  
< xs:element  name ="character"  type ="characterType"  
minOccurs
="0"  maxOccurs ="unbounded" />  
</ xs:sequence >  
< xs:attributeGroup  ref ="bookAttributes" />  
</ xs:complexType >

这些分组不是数据类型,而是包含一组元素或属性的容器,在整体复用上提供了方便。

排序(Compositors)

到目前为止,我们已经看到了xs:sequence排序元素,它定义了有序的元素组。W3C XML Schema支持另外两种排序元素, 它们可以被混合使用以支持各种组合形式。每个排序元素都拥有minOccurs 和maxOccurs 属性,来定义它们的基数。

xs:choice表示几种可能的元素中的一个选择,或者多组元素中的一个选择。以下的组——排序可以在组内出现、复杂类型或者其他的排序,将会接受单一的name元素或者一系列的firstName、可选的middleName以及lastName:

< xs:group  name ="nameTypes" >
    
< xs:choice >
      
< xs:element  name ="name"  type ="xs:string" />
      
< xs:sequence >
        
< xs:element  name ="firstName"  type ="xs:string" />
        
< xs:element  name ="middleName"  type ="xs:string"  minOccurs ="0" />
        
< xs:element  name ="lastName"  type ="xs:string" />
      
</ xs:sequence >
    
</ xs:choice >
  
</ xs:group >


xs:all 定义了一组无序的元素。下面的复杂类型定义允许其包含的元素以任意顺序排列:

< xs:complexType  name ="bookType" >
    
< xs:all >
      
< xs:element  name ="title"  type ="xs:string" />
      
< xs:element  name ="author"  type ="xs:string" />
      
< xs:element  name ="character"  type ="characterType"  minOccurs ="0"
       maxOccurs
="unbounded" />
    
</ xs:all >
    
< xs:attribute  name ="isbn"  type ="isbnType"  use ="required" />
</ xs:complexType >


为了避免组合变得复杂和模糊,而无法被W3C XML Schema工具所处理,一组约束被加到了xs:all:

  • 在内容模型上子节点必须唯一
  • 并且其子节点只能为xs:element定义或references,并且基数不能大于1

简单类型的派生

简单的数据类型都是派生于其他的数据类型,要么是被W3C XML Schema 名称空间预定义或标识的,要么是在你自己的schema定义的。

我 们之前看到了简单类型使用约束派生的例子(使用xs:restriction 元素)。可以应用的不同类别的约束称为切面(facet)。除了xs:pattern(使用正则表达式语法)和xs:maxLength这两个切面看过 外,许多切面允许在数据长度、值列表、最小和最大值、精确和可变等上面进行控制。

另外两个派生方法已经可用了,可以允许定义列表中分隔的空白和组合的数据类型。下面的定义使用xs:union扩展了我们的isbn类型,用了接受数据TDB和NA:

   < xs:simpleType  name ="isbnType" >
    
< xs:union >
      
< xs:simpleType >
        
< xs:restriction  base ="xs:string" >
          
< xs:pattern  value ="[0-9]{10}" />
        
</ xs:restriction >
      
</ xs:simpleType >
      
< xs:simpleType >
        
< xs:restriction  base ="xs:NMTOKEN" >
          
< xs:enumeration  value ="TBD" />
          
< xs:enumeration  value ="NA" />
        
</ xs:restriction >
      
</ xs:simpleType >
    
</ xs:union >
  
</ xs:simpleType >

union元素被应用到两个内嵌的简单类型上以允许两个数据类型的值数据,新类型现在将接受来自于一个枚举的两个可能值(TBD和NA)。

下面的例子,类型(isbnTypes)使用xs:list去定义一个ISBN数据的空白分隔的列表。它也是派生自一个类型(isbnTypes10)使用xs:restriction接受1到10的数据值,以空白分隔。

  < xs:simpleType  name ="isbnTypes" >
    
< xs:list  itemType ="isbnType" />
  
</ xs:simpleType >
  
< xs:simpleType  name ="isbnTypes10" >
    
< xs:restriction  base ="isbnTypes" >
      
< xs:minLength  value ="1" />
      
< xs:maxLength  value ="10" />
    
</ xs:restriction >
  
</ xs:simpleType >
 

内容类型

在文章的第一部分,我们检查了默认的内容类型行为,在面向数据的文档后建模,发现复杂类型的元素只是元素和属性,并且简单类型的元素是没有属性的字符数据。

W3C XML Schema 定义语言也支持定义空白内容元素,以及具有属性的简单内容(它们只包含字符串数据)。

空白内容元素使用xs:complexType结构并有意的忽略定义子元素。下列结构定义一个空白book元素并接受一个isbn属性。

< xs:element  name ="book" >  
< xs:complexType >  
< xs:attribute  name ="isbn"  type ="isbnType" />  
</ xs:complexType >  
</ xs:element >  

简单的内容元素,例如,具有属性的字符串数据元素,可以使用xs:simpleContent从简单类型派生。上面定义的book元素因此被扩展成可以接受一个文本数据:

< xs:element  name ="book" >  
< xs:complexType >  
< xs:simpleContent >  
< xs:extension  base ="xs:string" >  
< xs:attribute  name ="isbn"  type ="isbnType" />  
</ xs:extension >  
</ xs:simpleContent >  
</ xs:complexType >  
</ xs:element >  

注意属性定义的位置,显示扩展点是通过扩展属性完成的。这个定义将会接受下面的XML元素:

< book  isbn ="0836217462" >  
Funny book by Charles M. Schulz. 
Its title (Being a Dog Is a Full-Time Job) says it all ! 
</ book >

W3C XML Schema在 xs:complexType 元素中通过混合属性支持混合的内容。考虑下:

< xs:element  name ="book" >  
< xs:complexType  mixed ="true" >  
< xs:all >  
< xs:element  name ="title"  type ="xs:string" />  
< xs:element  name ="author"  type ="xs:string" />  
</ xs:all >  
< xs:attribute  name ="isbn"  type ="xs:string" />  
</ xs:complexType >  
</ xs:element >  

将验证这样的XML文件,如下:

< book  isbn ="0836217462" >  
Funny book by 
< author > Charles M. Schulz </ author >
Its title (
< title > Being a Dog Is a Full-Time Job </ title > ) says it all ! 
</ book >  

不像DTD那样,W3C XML Schema 混合内容不修改子元素的约束,简单内容模型可以使用相同的方式表示。虽然这是较XML 1.0 DTD重要的改进,但注意字符数据值以及其相对子元素的位置,其不能应用约束。

约束

Unique

W3C XML Schema 提供了几种灵活的基于XPath的特性,其描述了唯一性约束和一致性引用约束。首先,一个简单的唯一性声明,使用xs:unique元素进行声明。下面的声明建立在我们的book元素的名称必须唯一的前提下:

< xs:unique  name ="charName" >  
< xs:selector  xpath ="character" />  
< xs:field  xpath ="name" />  
</ xs:unique >  

xs:unique 元素在schema中的位置,给出了内容节点,其中包括了约束。靠在book元素插入xs:unique,我们指定了在全文中此book名称必须唯一。

唯一性约束中定义的两个XPath 相对符合内容节点。第一个使用selector元素定义,目的是定义拥有该唯一性约束的元素——selector指向的节点必须是一个元素节点。

第二个路径,在xs:field元素中定义的,是相对于xs:selector所标识的元素,其可以是一个元素或者一个属性节点。这就是一个其值将会被检查唯一性的节点。组合值可以通过在xs:unique中添加另外的xs:field元素来实现。

Key

第二个结构,xs:key,和xs:unique类似,除了其值不能为null(注意xs:unique和xs:key都可以被引用)。要使用一个字符串名称作为一个key,我们可以通过使用xs:key替换xs:unique实现。

< xs:key  name ="charName" >  
< xs:selector  xpath ="character" />  
< xs:field  xpath ="name" />  
</ xs:key >  

Keyref

第三个结构,xs:keyref,允许我们的那个有一个到xs:key或xs:unique的引用。要显示它的用法,我们将介绍friend-of 元素,将会针对字符串使用。

< character >  
< name > Snoopy </ name >  
< friend-of > Peppermint Patty </ friend-of >  
< since > 1950-10-04 </ since >  
< qualification >  
extroverted beagle 
</ qualification >  
</ character >

为了显示friend-of需要从同一本书参考一个字符,我们将会写,在同一个层次我们定义一个key约束,如下:

< xs:keyref  name ="charNameRef"  refer ="charName" >
  
< xs:selector  xpath ="character" />
  
< xs:field  xpath ="friend-of" />
</ xs:keyref >

 

这些功能基本独立于schema中的其他特性。它们从数据类型的定义中断开。唯一固定它们到schema的是它们被定义的位置,其中确定唯一性约束的范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值