喜悦国际村's Archiver

开心果 发表于 2004-4-20 11:11 PM

Dreamweaver与XML综合应用 第十章 XML Schema

第10章  XML Schema
通过前面的学习,大家都知道浏览器可以自动验证XML文档的良好性,可以创建DTD文件验证XML文档的有效性。但是有许多常用的限制不能用DTD来表述,这就促使Schema(大纲)诞生。Schema与DTD相比,有一个明显的好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用特殊格式。这大大方便了用户和开发者,因为可以使用相同的工具来处理XML Schema和其他XML信息,而不必专门为Schema使用特殊工具。DTD对用户来说是一种神秘的黑色艺术,Schema却简单易懂,人人都可以立刻理解。
在本章中,首先概述性地介绍了XML Schema,使读者迅速消除Schema的神秘感,从而对它在整体上有所把握。然后通过具体的实例,介绍如何编写XML Schema,包括其元素、属性类型的定义,注释的编写,使用其他大纲等内容。
10.1  XML Schema概述
在本节中主要对Schema进行概念上的介绍,其中包括使用Schema的必要性以及Schema的优越性,Schema的新特色是什么以及Schema的应用领域等问题。使读者能从整体上把握Schema。
10.1.1  为什么需要Schema
通过前面的学习,大家到知道XML语言有其严格的规范,以适应广泛的应用。XML文档必须符合XML的语法限制。与此同时,在特定的应用中,数据本身有含义上、数据类型上、数据关联上的限制,也就是语义限制,这是一个值得讨论的问题。
例如在FOML(一种描述数学公式的XML)中,每种函数都有其特定的组成部分,积分函数必须包含积分上限、积分下限和被积分项,同时不能包含其他非法成分,这种限制不是XML语法所能规定的,必须用其他方式告诉用户和计算机。
XML在当今的IT行业中,被赋予了越来越多的职责和功能。例如,作为文本数据库存储数据,作为某一行业中数据交换的标准表示等。这些都需要相应的XML文件中对数据的描述,如数据类型、长度进行严格的定义,这样才能真正做到数据的安全性和行业统一标准,并有通用的规则对其进行解析。然而,XML在其产生的时候就被定义为高开放性,用文本方式浏览,用标签来定义的标记语言,鉴于XML的这些特点,就像HTML文件一样,XML文件本身无法对文件中的数据进行严格定义。
XML Schema正是在这种情况下应运而生的,它可以用来定义XML文件的文本结构、数据类型等XML文件描述规则的。
10.1.2  Schema的诞生
Schema曾被微软使用过,他们发展了一套不同于DTD方法来定义XML数据类型,并给出了自己的定义。可以说,微软的Schema启发了一种很好的思想,并成为现今的W3C定义Schema的原型。但是,W3C的Schema与微软的Schema是不同的,它是在W3C的专家们充分讨论和论证的基础上产生的。在1999年2月15日,W3C发布了一个需求定义,说明了新定义的Schema必须符合的要求。1999年5月6日,W3C完成并发布了Schema的定义。
10.1.3  XML Schema与DTD的区别
XML Schema与DTD都可以用来验证XML文档,那么到底什么时候使用XML Schema,什么时候使用DTD呢?在什么情况下使用什么技术,就看什么技术在短期内和长期情况下能给出最大的价值,这就有需要了解这两种技术之间的区别。下面就对这两种技术之间的区别进行简单的介绍。
1.语法的区别
DTD有自己的特殊语法。而XML Schemas是XML文档,它是用XML写的。这就给用户带来了如下三个好处:
(1)只要了解简化的XML数据(XML-data Reduced)的语法规则,无需知道两种语法来编写语法合格的XML Schema,而且不需要担心两套语法合格规则。
(2)软件工具可以利用XML文档和Schemas之间语法通用这一优点为两者提供支持。也就是说掌握了一种语法就可以为另一种语法建立支持也是挺容易的。例如支持操作XML文档的分析器也能用来操作Schemas,但是DTD不能以同样的方式操作。
(3)XML Schemas能够扩展开来,能向XML schemas中加入元素和属性。只要元素和属性名域不同,它们在一个Schema中是合法的。而DTD将无法解析扩充的内容。
2.数据类型的区别
DTD只允许把内容类型定义为一个字符串。而XML schemas允许把内容类型定义为整型、浮点型、数据型、布尔型或者许多其他的简单数据类型。如果想要编写一个应用软件来处理那个元素的内容,并且需要那个元素的值为整数,在DTD中,必须把它转化成一个整数,而在Schema中,可以直接得到那个整数值。
3.是否支持名域
XML Schema利用名域将文档中特殊的节点与Schema说明相联系,一个XML文件可以有对应多个Schema。而如果使用DTD的话,一个XML文件只能有一个与之相对应的DTD。
10.1.4  XML Schema的优越性
XML Schema与DTD相比,有如下的优越性:
(1)丰富的数据类型:它们包括布尔型、数字、日期时间、URIs整数、十进制数、市属、时间间隔等。而且它还支持由这些简单的类型生成复杂的类型。
(2)有由用户定义的数据类型:由用户定义的数据类型被称为Archetypes(原型)。例如可以先定义PostalAddress这个数据类型,然后定义ShippingAddress和BillingAddress,是这个类型的两个元素。
(3)属性(Attribute)分组:属性的应用范围是多种多样的,有的是所有元素都有的,有的是专门为图形元素设定的,为了表明这些关系,在DTD中我们是用参数体实现的。
(4)可修改的Archetypes(原型):可修改的Archetypes是最重要的特色。DTD定义的内容模式是封闭的,而XML Schema定义的是开放的、可修改的。
10.1.5  Schema的应用领域
Schema的应用领域包含如下一些。
电子商务
网络信息传递与监控
信息出版与共享
文档归类
元数据交换
数据库与应用程序的信息交换
大到英特网,小到XML和Schema,都正处于飞速发展与变化中。Schema的概念提出已久,但W3C的标准最近才出来,相应的应用支持正在完善之中。但Schema乃XML发展之大势所趋,必将得到广泛应用。
10.2  使用XML Schema
在本节中,将具体介绍Schema的格式,元素、属性类型的定义、元素组、archetypes以及如何使用其他大纲中的定义等内容。
10.2.1  Schema的格式
通过本章前面的学习,大家知道XML Schema本身也是一个XML文件,所不同的是,Schema文件所描述的是对引用它的XML文件的元素和属性的具体类型的。作为一个Schema文件,其特殊的文件头格式为如下所示:
<?xml version="1.0"?>
<Schema name="schema_sample_1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<!--…………..-- >
</Schema>
其中<?xml version="1.0"?>是XML文件的文件头;Schema name="schema_sample_1"是一个名称,在一般的情况下,该名称可以省略;xmlns="urn:schemas-microsoft- com:xml-data",它是引用微软Schema类型定义,在一般情况下也是可以省略的;xmlns:dt="urn:schemas-microsoft-com:datatypes"> ,它也是引用微软Schema数据类型定义,在一般情况下也是可以省略的;<!--…………..-- >标识具体的文件内容。
大纲的元素名表明这是一个大纲,“xmlns”是一个名域声明,它标明大纲元素由称作“urn:schemas-microsoft-com:xml-data”的规范明确定义,因而有别于其他任何类似名称的元素。
在前面介绍XML语法时,曾经说过XML文档中只能有一个根元素。在一个定义Schema的XML文件中,必须注意的是,文件的根一定为<Schema>… </Schema>。
在文件的具体内容中,可以添加对某个XML结构、数据类型的定义。
10.2.2  元素
先来看一个XML文档,下面所介绍的内容是以它为基础的。其代码如下所示:
<book>
     <title>中风的防治与康复</title>
     <authors>
       <author>
            <name>吴运泉</name>
        <phone>0730-4848764</phone>
        <EMail>wuyunquan@263.net</EMail>
        <Fax>0730-1258456</Fax>
      </author>

      <author>
         <name>马秀琴</name>
         <phone>0732-4844464</phone>
         <EMail>maxiuqin@263.net</EMail>
         <Fax>0732-1247696</Fax>
      </author>
     </authors>
     <press>
           <appellation>科学出版社</appellation>
        <city>北京</city>
           <postcode> 100717</postcode>
           <state>东黄城根北街16号</state>
         </press>
     <price>12.000</price>
         <Printdate>2000.07.11</Printdate>
         <impression>10000</impression>
     <resume>脑是智慧的源泉。中风是破坏大脑的罪魁祸首,是埋在体内的定时炸弹。一旦发生中风,轻者致残,重者致命,对健康危害极大,生命质量大为降低。然而,中风是可以预防或推迟发生的,其行之有效的方法就是学习、认识此病的病因,掌握一些预防方法。人人都来关心自己,关心亲人,静下心来学点医学科普知识,懂得一些预防措施,让中风远离我们,让我们生活得更美好。本书原名是《中风防冶新法手册》,由于该书所用资料新颖,信息量大,内容丰富,图文并茂,深入出,通俗易懂,具有严格的科学性和浓厚的趣味性,因此,不仅受到国内读者的好评,而且受到港台同胞、国外(美国、加拿大、新加坡等)华侨的欢迎,这些使我们深受鼓舞。此次应科学出版社《生活与科学文库》组之邀,将该书进行修订和删补。为了使读者更好理解,本书增加了眼中风、脊中风等疾病,康复部分增加了饮食疗法、性生活康复,这些都是读者希望增加的内容。
     </resume>
  </book>
ElementType是Schema中最基本的,它用来定义XML文件中元素的格式,数据类型等。
book包括几种元素,ElementType是定义它们的机制。例如能够使用下面的代码定义一个简单元素类型title:
<ElementType name="title" />
更复杂的元素不仅仅包括文字,它们可能包括特定形式的文本或者包含其他元素的文本。例如在本例中想规定Printdate元素为日期,可以使用如下所示的代码。
<ElementType name=" Printdate " dt:type="date" />
在元素的定义中引用了其他的适当的元素类型,例如使用如下所示的代码使press元素包括其他元素:
<ElementType name="press" />
    <element type="appellation" />
    <element type="city" />
    <element type="postcode" />
    <element type="state" />
  </ElementType>
这表示每当press元素出现,其中必须有四个子元素,依次是appellation,city,postcode和state,当然需要在此之前就定义这些元素。在本例中使用了如下所示的代码定义它们:
<schema xmlns="urn:schema-microsoft-com:xml-data"
xmlns:dt="urn:schema-microsoft-com:datatypes">
    <ElementType name="book">
        <ElementType name="title"/>
        <Element type="author"/>
        <Element type="press"/>
        <Element type="price" />
        <Element type="Printdate"/>
        <Element type="impression " />
        <Element type="resume" />
</ElementType>

   <ElementType name="title" />
<ElementType name="authors">
<Element type name="author"/>
</ElementType>
<ElementType name="author">
          <Element type="name" />
          <Element type="phone" />
          <Element type="EMail" />
          <Element type="Fax" />
</ElementType>

<ElementType name="name" />
         <ElementType name="phone" />
         <ElementType name="EMail" />
         <ElementType name="Fax" />
<ElementType name="press">
    <Element type="appellation"/>
    <Element type= "postcode"/>
    <Element type="city"/>
    <Element type="state"/>
</ElementType>
<ElementType name="appellation"/>
<ElementType name="city"/>
<ElementType name="postcode"/>
<ElementType name="state"/>
    <ElementType name="price" dt:type="fixed.14.4"/>
    <ElementType name="Printdate" dt:type="date"/>
    <ElementType name="impression " dt:type="int"/>
<ElementType name="resume" />
</schema>
以上代码可以在Dreameaver 4代码视图窗口进行编辑(在编辑以上代码以前,必须将所有的其他代码删除),从以上代码中可以看出,定义一个ElementType的基本格式如下所示:
<ElementType
    content="{empty | textOnly | eltOnly | mixed}"
    dt:type="datatype"
    model="{open | closed}"
name="idref"
    order="{one | seq | many}" >
</ElementType>
从ElementType的基本格式中可以看出它应该包括如下几个部分。
1.content
一个元素可以包括简单的文字、其他简单的元素、文本和元素的混合。可以通过使用内容属性来规定。Content(内容)用于描述元素中的内容类型,这个属性包含了empty,textOnly,eltOnly和mixed四个属性值。其中empty表示内容为空,textOnly表示只包含文本类型的内容,eltOnly表示只包含元素类型的内容,而mixed表示包含上述任何情况。例如下面的代码说明了这几个属性值的应用。
<ElementType name="x1" content="empty"/>
<ElementType name="x2" content="textOnly"/>
<ElementType name="x3" content="eltOnly">
    <element type="y">
</ElementType>
<ElementType name="x4" content="mixed">
    <element type='q'>
    <element type='r'>
</ElementType>
2.dt:type
dt:type(数据类型)属性用于指定元素文本的数据类型。这个属性包含了boolean,char,date,date time,float,int,number,time和string等。其中boolean表示是布尔型;char表示是字符型;date表示是日期型;date time表示是日期时间型;float表示是实型;int表示是整型;number表示是数字型;time表示是时间型;string表示字符串类型。此外还有entity,entities,enumeration,id,idref,idrefs,nmtoken,nmtokens,notation等XML补充类型。
上面中只列举了一部分常见数据类型,如果想得到关于dt:type更详细的信息,请参看MSDN。
3.minOccurs和maxOccurs
maxOccurs(出现最多次数)属性是一个限制规则,表示可以出现不止一个但必须是有限个Item元素。maxOccurs的有效值为1 和“*”。同样,可以用minOccurs规定最少次数,例如可以设置minOccurs为0,使得一个子元素是可选择的。minOccurs缺省值为1,maxOccurs也为1。这些属性不仅可以用于元素还适用于组声明(group declarations)。
4.order
如果子元素必须以一定顺序出现,或集合中仅能出现一个,可以用顺序属性来表示。要明确地表明在大纲中所列的子元素必须按序出现,可使order属性为seq值。例如下面的代码:
<ElementType name="book" order="seq">
如果想要假定一个元素可以从多个子元素中选出,应该使用的值为“one”。例如,如果一个author元素可以包括phone元素或者workphone元素,但又不是同时包括两者时,必须使用如下所示的代码:
<ElementType name="author" order="one">
    <element type="phone" />
    <element type="workphone" />
</ElementType>
order元素的第三个通常值为many,表示子元素可以以任意顺序任意数量出现。
如果没有声明一个元素的内容模型的顺序,当content属性值为eltOnly时,order的缺省值为seq,而当content属性值为mixed时,order的缺省值为many。
5.group
有时限制不对元素的所有子元素适用,而只是其中的一些,可以使用分组元素。例如,要标明author元素有一个phone或workphone元素,以及name和Fax元素,应该使用如下所示的代码:
<ElementType name="author">
    <group order="one">
        <element type="phone" />
        <element type="workphone" />
    </group>
    <element type="name"/>
    <element type="Fax"/>
</ElementType>
group的一般表达形式如下所示。
<group
maxOccurs="{1 | *}"
minOccurs="{0 | 1}"
order="{one | seq | many}" >
在一个分组元素中,可以设置order,minOccurs和maxOccurs属性来控制所包含元素出现的顺序和数量。
maxOccurs定义该group出现的最多次数,1表示只能调用一次,“*”表示可以调用任意次。
minOccurs定义该group出现的最少次数,0表示无要求,1表示至少调用一次。
order定义该group中element的排列顺序,one表示只允许元素内容按一种方式排列, seq表示允许元素内容按指定的方式排列,many表示可以按任意方式排列。例如下面所示的代码。
<ElementType name="x" order="one">
    <group order="seq">
        <element type="x1">
        <element type="y1">
</group>

    <group order="seq">
        <element type="x2">
        <element type="y2">
    </group>
</ElementType>
6.model
在有些情况下,想要设置一个元素包含的最低需求,比如,假设book必须至少有下列的直接子元素,title,authors,press,price和Printdate,而且其他的子元素也可以同时出现。设置model的属性值为open时允许有其他子元素。例如如下代码。
<ElementType name="book" model="open">
    <element type="title"/>
    <element type="authors "/>
    <element type="press "/>
    <element type="price" />
    <element type="Printdate"/>
</ElementType>
由于在默认情况下,在XML-Data中内容模型是开放的,所以<ElementType name="book" model="open">可以改写为<ElementType name="book">。
相反的情况是“封闭的(closed)”,不管元素的内容是“eltOnly”或“mixed”,都能通过模型属性为“closed”来限制其只能包含列出的属性或子元素,例如如下所示的代码:
<ElementType name="book" model="closed">
    <element type="title"/>
    <element type="authors "/>
    <element type="press "/>
    <element type="price" />
    <element type="Printdate"/>
</ElementType>
按照以上的六个原则,并把它们添加到初始的大纲中,其完整的代码如下所示:
<schema xmlns="urn:schema-microsoft-com:xml-data"
xmlns:dt="urn:schema-microsoft-com:datatypes">
  <ElementType name="book" content="eltOnly" >
      <ElementType name="title"/>
      <Element type="author"/>
      <Element type="press"/>
      <Element type="price" />
      <Element type="Printdate"/>
      <Element type="impression " />
      <Element type="resume" />
</ElementType>

    <ElementType name="title" minOccurs="1" content="textOnly"/>

<ElementType name="authors" model="closed">
        <element type="author" maxOccurs="*"/>
</ElementType>
<ElementType name="author">
        <Element type="name" />
    <group order="one">
          <Element type="phone" />
          <Element type="workphone" />
        </group>
          <Element type="EMail" />
          <Element type="Fax" />
</ElementType>
<ElementType name="name" content="textOnly"/>
        <ElementType name="phone" content="textOnly"/>
        <ElementType name="workphone" content="textOnly"/>
        <ElementType name="EMail" content="textOnly"/>
        <ElementType name="Fax" content="textOnly"/>

<ElementType name="press" content="teltOnly">
    <Element type="appellation"/>
    <Element type="city"/>
    < Element type= "postcode"/>
    <Element type="state"/>
</ElementType>
<ElementType name="appellation" content="textOnly"/>
<ElementType name="city" content="textOnly"/>
<ElementType name="state" content="textOnly"/>

    <ElementType name="price" dt:type="fixed.14.4"/>
    <ElementType name="Printdate" dt:type="date"/>
    <ElementType name="impression " dt:type="int"/>
<ElementType name="resume" minOccurs="0" content="textOnly"/>
</schema>
10.2.3  在Schema中使用名域
能从标准部分中建立子定义的大纲(例如book)是很不错的。例如,假设有他人已经定义了一个需要用于press元素的adress元素,将在book中直接使用,不是只照抄adress元素的定义,而是索引原定义让使用和初始一致,这就要用到名域。
要引用在另一大纲中定义的元素,必须做两件事。
第一,使用名域声明来引出另一大纲,该声明包括一个以“xmlns:”开头的属性。
第二,选择的前缀名,最后是另一大纲的统一资源标识符Universal Resource Identifier(简称URI)。例如:
<ElementType name="PurchaseOrder"
            xmlns:xyz="http://electrocommerce.org/stuff.xml" >
这里介绍的URI为“http://electrocommerce.org/stuff.xml”的大纲,并给出前缀“xyz”。URI明确表明另一大纲,前缀是在本地引用该名域的局部名称。宣告完成之后,就可以在那个大纲中引用该元素,就像是自己定义的元素。如果另一个大纲有合适的shipTo元素被定义,就可以按照如下所示的代码来使用。
<ElementType name="press"      
               xmlns:xyz="http://electrocommerce.org/stuff.xml" >
    <element type="xyz: adress"/>
</ElementType>
在第一个子元素的类型属性中,发现了值“xyz: STATE”,前缀“xyz”这里与嵌套名域声明相匹配,这样“xyz: adress”是指“由http://electrocommerce.org/stuff.xml中的大纲定义的adress元素”。
而且,这对book这个XML文档产生了影响,在此文档中也要引用这一大纲名域。代码如下所示:
<book xmlns:xyz="http://electrocommerce.org/stuff.xml">
     <title>中华抗衰老医药学</title>
     <authors>
       <author>
            <name>张洪泉</name>
        <phone>0739-4848764</phone>
        <EMail>zhanghongquan@263.net</EMail>
        <Fax>0739-1258456</Fax>
      </author>

      <author>
         <name>余文新</name>
        <phone>0735-4844464</phone>
        <EMail>yuwenxin@263.net</EMail>
        <Fax>0735-1247696</Fax>
      </author>
     </authors>
     <press>
        <xyz:address>
            <xyz: appellation >科学出版社</xyz: appellation >
            <xyz:city>北京</xyz:city>
            <xyz:postcode>100084</xyz: postcode >
            <xyz:state>东黄城根北街16号</xyz:state>
        </xyz:address>
</press>

    <price>179.00</price>
         <Printdate>2000-04-10</Printdate>
         <impression>10000</impression>
     <resume>《中华抗衰老医药学》是一部大型老年医药学专著。全书分为上、中、下三篇,共71章。上篇为衰老与抗衰老基础理论及研究方法部分:分别从分子、细胞、器官、系统不同层次,以及从中西医学不同角度论述了衰老和抗衰老理论;同时系统地从生物学、分子生物学、化学、生理学、生物化学、免疫学、药理学、实验动物学、临床医学和中医学等方面介绍了当代研究衰老和抗衰老的主要方法。中篇为抗衰老药物学与老年疾病的临床治疗:全面介绍了古今中外用于延年益寿和老年疾病治疗的化学药物十天然药物、中药复方制剂、微量元素药物、生物化学药物、酒茶以及老年临床药理学;系统介绍了老年人常见各系统疾病的临床治疗。下篇为老年保健及衰老与抗衰老的研究进展:分别从性功能、营养、药膳、体育锻炼、心理和精神等方面介绍了老年保健理论和实用知识;对当今国际上和祖国医学在抗衰老研究方面的热点问题、主要进展和主要思路作了全面论述。全书充分阐述了当代国内外文献所记载或正在研究申的衰老和抗衰老的理论、动态、研究方法和研究思路;全面介绍了中西临床医学及药物学、营养学、心理学和运动医学在延缓衰老方面的各种措施、方法及经验;充分体现了先进洼、科学性、系统性和实用性。本书对医药院校、E药科研单位、E院、疗养院等各级老年医学研究和服务中介机构中的教学科研人员、研究生、医护人员、老年保健工作人员和广大的老年朋友,具有很大的参考价值和收藏价值。
     </resume>
  </book>
在阅读该文档实例的任何人,甚至是并不理解“book”意思的人都能够判断address 元素是由“http://electrocommerce.org/stuff.xml”处的大纲定义的。如果能从更被广泛理解标准部分中(如地址address元素)构建专业化大纲(如book),那么那些专业文档部分可以由标准软件模块来处理。例如,如果已经有了用于“由http://electrocommerce. org/stuff.xml定义的address元素”的XSL样式表,在任何这样的地址元素出现处重用该通用地址样式代码,几乎是免费得到定货单地址的格式。
在大纲和文档实例中使用同样的前缀,但是也不是非这样不可。因为前缀是名域URI的唯一局部别名,可以在文档实例中使用任何喜欢的前缀。所有要做的是在一个文档中,在声明名域和由该名域使用元素时采用相同的前缀。例如下面的代码使用“liu”来代替“xyz”,对于解析代码和显示结果没有丝毫的影响。
<book xmlns:xyz="http://electrocommerce.org/stuff.xml">
     …
     <press>
        <xyz:address>
            <xyz: appellation >科学出版社</xyz: appellation >
            <xyz:city>北京</xyz:city>
            <xyz:postcode>100084</xyz: postcode >
            <xyz:state>东黄城根北街16号</xyz:state>
        </xyz:address>
</press>

由于名域的声明限于其出现的元素,使得名域前缀有效并与URI相结合。因此声明不必一定要在book元素中出现,因为只用另一名域代表address元素,它可以在那儿直接出现。例如如下所示的代码:
<book>
    <press>
        <liu:address xmlns:liu="http://electrocommerce.org/stuff.xml">
            <liu: appellation >科学出版社</xyz: appellation >
            <liu:city>北京</xyz:city>
            <liu:postcode>100084</xyz: postcode >
            <liu:state>东黄城根北街16号</xyz:state>
        </liu:address>
</press>

不仅能给任何特定名域分配特殊的前缀,还能规定名域缺少前缀,这通常使得文档更易读。通过省略名域声明中的前缀来表示没有前缀的子元素都由指定的名域来定义。例如如下所示的代码:
<press>
    <address xmlns="http://electrocommerce.org/stuff.xml" >
        <appellation >科学出版社</xyz: appellation >
        <city>北京</xyz:city>
        <postcode>100084</xyz: postcode >
        <state>东黄城根北街16号</xyz:state>
    </address>
</press>
名域前缀只是文档内的标记,重要的是相应的URI,因此以上四个address元素含义完全相同。
尽管在名为“http://electrocommerce.org/stuff.xml”的大纲中定义了address元素,还没有类似地把book元素和大纲相联系。假设名叫“http://fabrikam.com/PO.xml”的大纲定义book元素,可以使用如下所示的代码将它们连接起来:
<book xmlns="http://fabrikam.com/PO.xml">
     <title>中华抗衰老医药学</title>
     <authors>
       <author>
            <name>张洪泉</name>
        <phone>0739-4848764</phone>
        <EMail>zhanghongquan@263.net</EMail>
        <Fax>0739-1258456</Fax>
      </author>

      <author>
         <name>余文新</name>
        <phone>0735-4844464</phone>
        <EMail>yuwenxin@263.net</EMail>
        <Fax>0735-1247696</Fax>
      </author>
     </authors>
     
<press>
        <address xmlns="http://electrocommerce.org/stuff.xml" >
            <xyz: appellation >科学出版社</xyz: appellation >
            <xyz:city>北京</xyz:city>
            <xyz:postcode>100084</xyz: postcode >
            <xyz:state>东黄城根北街16号</xyz:state>
        </xyz:address>
</press>

    <price>179.00</price>
<Printdate>2000-04-10</Printdate>
<impression>10000</impression>
    <resume>《中华抗衰老医药学》是一部大型老年医药学专著。全书分为上、中、下三篇,共71章。上篇为衰老与抗衰老基础理论及研究方法部分:分别从分子、细胞、器官、系统不同层次,以及从中西医学不同角度论述了衰老和抗衰老理论;同时系统地从生物学、分子生物学、化学、生理学、生物化学、免疫学、药理学、实验动物学、临床医学和中医学等方面介绍了当代研究衰老和抗衰老的主要方法。中篇为抗衰老药物学与老年疾病的临床治疗:全面介绍了古今中外用于延年益寿和老年疾病治疗的化学药物十天然药物、中药复方制剂、微量元素药物、生物化学药物、酒茶以及老年临床药理学;系统介绍了老年人常见各系统疾病的临床治疗。下篇为老年保健及衰老与抗衰老的研究进展:分别从性功能、营养、药膳、体育锻炼、心理和精神等方面介绍了老年保健理论和实用知识;对当今国际上和祖国医学在抗衰老研究方面的热点问题、主要进展和主要思路作了全面论述。全书充分阐述了当代国内外文献所记载或正在研究申的衰老和抗衰老的理论、动态、研究方法和研究思路;全面介绍了中西临床医学及药物学、营养学、心理学和运动医学在延缓衰老方面的各种措施、方法及经验;充分体现了先进洼、科学性、系统性和实用性。本书对医药院校、E药科研单位、E院、疗养院等各级老年医学研究和服务中介机构中的教学科研人员、研究生、医护人员、老年保健工作人员和广大的老年朋友,具有很大的参考价值和收藏价值。
     </resume>
  </book>
以上声明了book元素以及它包含的所有元素都在“http://fabrikam.com/ PO.xml”大纲中定义,除了address元素和其子元素在 xmlns="http://electro- commerce.org/stuff.xml"中定义。两种情况中,明确的前缀都省略了。
可以在一个文档中声明多个名域,也可以用几个前缀来代表相同的名域。下例显示了这点,但只是表明可以这么做,特别要指出的是该文档的意义与前例完全一致。
<book xmlns:x="http://fabrikam.com/PO.xml"
                xmlns:y="http://electrocommerce.org/stuff.xml"
                xmlns:z="http://electrocommerce.org/stuff.xml" >
    <x:title>中华抗衰老医药学</title>
     <x:authors>
       <x:author>
            <x:name>张洪泉</x:name>
        <x:phone>0739-4848764</x:phone>
        <x:EMail>zhanghongquan@263.net</x:EMail>
        <x:Fax>0739-1258456</x:Fax>
      </x:author>

      <x:author>
         <x:name>余文新</x:name>
        <x:phone>0735-4844464</x:phone>
        <x:EMail>yuwenxin@263.net</x:EMail>
        <x:Fax>0735-1247696</x:Fax>
      </x:author>
     </x:authors>

<x:press>
        <y:address xmlns="http://electrocommerce.org/stuff.xml" >
            <z:appellation >科学出版社</z:appellation >
            <y:city>北京</y:city>
            <z:postcode>100084</z: postcode>
           <y:state>东黄城根北街16号</y:state>
       </y:address>
</x:press>

    <x:price>179.00</x:price>
         <x:Printdate>2000-04-10</x:Printdate>
         <x:impression>10000</x:impression>
     <x:resume>中华抗衰老医药学》是一部大型老年医药学专著。全书分为上、中、下三篇,共71章。上篇为衰老与抗衰老基础理论及研究方法部分:分别从分子、细胞、器官、系统不同层次,以及从中西医学不同角度论述了衰老和抗衰老理论;同时系统地从生物学、分子生物学、化学、生理学、生物化学、免疫学、药理学、实验动物学、临床医学和中医学等方面介绍了当代研究衰老和抗衰老的主要方法。中篇为抗衰老药物学与老年疾病的临床治疗:全面介绍了古今中外用于延年益寿和老年疾病治疗的化学药物十天然药物、中药复方制剂、微量元素药物、生物化学药物、酒茶以及老年临床药理学;系统介绍了老年人常见各系统疾病的临床治疗。下篇为老年保健及衰老与抗衰老的研究进展:分别从性功能、营养、药膳、体育锻炼、心理和精神等方面介绍了老年保健理论和实用知识;对当今国际上和祖国医学在抗衰老研究方面的热点问题、主要进展和主要思路作了全面论述。全书充分阐述了当代国内外文献所记载或正在研究申的衰老和抗衰老的理论、动态、研究方法和研究思路;全面介绍了中西临床医学及药物学、营养学、心理学和运动医学在延缓衰老方面的各种措施、方法及经验;充分体现了先进洼、科学性、系统性和实用性。本书对医药院校、E药科研单位、E院、疗养院等各级老年医学研究和服务中介机构中的教学科研人员、研究生、医护人员、老年保健工作人员和广大的老年朋友,具有很大的参考价值和收藏价值。
     </x:resume>
  </x:book>
</x:book>:book>
如果一个文档的大纲中有开放内容模式(open content model)的元素,那可以包含最初大纲没有提及的元素,只要这些元素由前缀或者由于在缺省大纲的范围之内指派为特定的名域定义。例如,假设有第三个大纲定义了一个称为“trackingInformation”的有用元素,因为定义了PurchaseOrder有开放内容模式,可以按照如下所示的代码,把这个元素直接加入例中。
<book xmlns="http://fabrikam.com/PO.xml">
    <title>中华抗衰老医药学</title>
     <authors>
       <author>
            <name>张洪泉</name>
        <phone>0739-4848764</phone>
        <EMail>zhanghongquan@263.net</EMail>
        <Fax>0739-1258456</Fax>
      </author>

      <author>
         <name>余文新</name>
        <phone>0735-4844464</phone>
        <EMail>yuwenxin@263.net</EMail>
        <Fax>0735-1247696</Fax>
      </author>
     </authors>
<press>
        <address xmlns="http://electrocommerce.org/stuff.xml" >
            <appellation>科学出版社</appellation>
            <city>北京</city>
               <postcode>100084</postcode>
               <state>东黄城根北街16号</state>
        </address>
</press>

    <price>179.00</price>
         <Printdate>2000-04-10</Printdate>
         <impression>10000</impression>
     <resume>中华抗衰老医药学》是一部大型老年医药学专著。全书分为上、中、下三篇,共71章。上篇为衰老与抗衰老基础理论及研究方法部分:分别从分子、细胞、器官、系统不同层次,以及从中西医学不同角度论述了衰老和抗衰老理论;同时系统地从生物学、分子生物学、化学、生理学、生物化学、免疫学、药理学、实验动物学、临床医学和中医学等方面介绍了当代研究衰老和抗衰老的主要方法。中篇为抗衰老药物学与老年疾病的临床治疗:全面介绍了古今中外用于延年益寿和老年疾病治疗的化学药物十天然药物、中药复方制剂、微量元素药物、生物化学药物、酒茶以及老年临床药理学;系统介绍了老年人常见各系统疾病的临床治疗。下篇为老年保健及衰老与抗衰老的研究进展:分别从性功能、营养、药膳、体育锻炼、心理和精神等方面介绍了老年保健理论和实用知识;对当今国际上和祖国医学在抗衰老研究方面的热点问题、主要进展和主要思路作了全面论述。全书充分阐述了当代国内外文献所记载或正在研究申的衰老和抗衰老的理论、动态、研究方法和研究思路;全面介绍了中西临床医学及药物学、营养学、心理学和运动医学在延缓衰老方面的各种措施、方法及经验;充分体现了先进洼、科学性、系统性和实用性。本书对医药院校、E药科研单位、E院、疗养院等各级老年医学研究和服务中介机构中的教学科研人员、研究生、医护人员、老年保健工作人员和广大的老年朋友,具有很大的参考价值和收藏价值。
     </resume>
  </book>
因为要求任何未提及的属性或元素都要有名域限制,trackingInformation元素如果没有xmlns属性将是无效的。
10.2.4  属性
XML文档主要由元素和属性组成。通过前面的学习可以看到了信息完全用元素来表达的book。但是如果想要如下所示代码的book,就需要一个不同的大纲。
<book xmlns="http://fabrikam.com/PO.xml"
    title="中华抗衰老医药学"
    price="179.00"
    Printdate="2000-04-10"
    Impression="10000"
    Resume="中华抗衰老医药学》是一部大型老年医药学专著。全书分为上、中、下三篇,共71章。上篇为衰老与抗衰老基础理论及研究方法部分:分别从分子、细胞、器官、系统不同层次,以及从中西医学不同角度论述了衰老和抗衰老理论;同时系统地从生物学、分子生物学、化学、生理学、生物化学、免疫学、药理学、实验动物学、临床医学和中医学等方面介绍了当代研究衰老和抗衰老的主要方法。中篇为抗衰老药物学与老年疾病的临床治疗:全面介绍了古今中外用于延年益寿和老年疾病治疗的化学药物十天然药物、中药复方制剂、微量元素药物、生物化学药物、酒茶以及老年临床药理学;系统介绍了老年人常见各系统疾病的临床治疗。下篇为老年保健及衰老与抗衰老的研究进展:分别从性功能、营养、药膳、体育锻炼、心理和精神等方面介绍了老年保健理论和实用知识;对当今国际上和祖国医学在抗衰老研究方面的热点问题、主要进展和主要思路作了全面论述。全书充分阐述了当代国内外文献所记载或正在研究申的衰老和抗衰老的理论、动态、研究方法和研究思路;全面介绍了中西临床医学及药物学、营养学、心理学和运动医学在延缓衰老方面的各种措施、方法及经验;充分体现了先进洼、科学性、系统性和实用性。本书对医药院校、E药科研单位、E院、疗养院等各级老年医学研究和服务中介机构中的教学科研人员、研究生、医护人员、老年保健工作人员和广大的老年朋友,具有很大的参考价值和收藏价值。"
   authors="author1 author2"
press="adress1">
      <author name="张洪泉"
             phone="0739-4848764"
             Email="zhanghongquan@263.net"
             Fax="0739-1258456"/>
      
       <author name="余文新"
             phone="0735-4844464"
             Email="yuwenxin@263.net"
             Fax="0735-1247696"/>

     <address id="adress1"
                 appellation="科学出版社"
             city="北京"
                 postcode="100084"
                 state="东黄城根北街16号"/>
</book>
实际上,要求几个大纲间存在差异,因为将需要改变“http://fabrikam.com/PO.xml”和“http://electrocommerce.org/stuff.xml”。修改后的PurchaseOrder大纲代码如下所示:
<schema xmlns="urn:schema-microsoft-com:xml-data"
         xmlns:dt="urn:schema-microsoft-com:datatypes">
    <ElementType name="book" content="eltOnly" >
        <AttributeType name="title" dt:type="string"/>
            <attribute type="title"/>>
        <AttributeType name="authors" dt:type="idref"/>
            <attribute type="authors"/>
        <AttributeType name="press" dt:type="idrefs"/>
            <attribute type="press" />
<AttributeType name="price" dt:type="fixed.14.4"/>
            <attribute type="price"/>
<AttributeType name="Printdate" dt:type="date"/>
            <attribute type="Printdate"/>
<AttributeType name="impression" dt:type="int"/>
            <attribute type="impression"/>
        <AttributeType name="resume" dt:type="string"/>
            <attribute type="resume"/>
        <Element type="xyz:address"           
                  xmlns:xyz="http://electrocommerce.org/stuff.xml" />
        <Element type="Items" maxOccurs="*"/>
</ElementType>

    <ElementType name="author">
        <AttributeType name="id" dt:type="id"/>
            <attribute type="id" />
        <AttributeType name="name" dt:type="string"/>
            <attribute type="name" />
        <AttributeType name="phone" dt:type="string"/>
            <attribute type="phone" />
        <AttributeType name="EMail" dt:type="string"/>
            <attribute type="EMail" />
        <AttributeType name="Fax" dt:type="string"/>
            <attribute type="Fax" />
    </ElementType>
</schema>
通过上面的实例,可以知道定义AttributeType的基本格式如下所示:
<AttributeType
    default="default-value"
    dt:type="primitive-type"
    dt:values="enumerated-values"
    name="idref"
    required="{yes | no}" >
例如,首先用AttributeType元素声明属性类型。
<AttributeType name="press" dt:type="idref"/>
然后用attribute元素来引用。
<attribute type="press"/>
属性声明和引用通常成对出现。
<AttributeType name="press" dt:type="idref"/>
    <attribute type="press"/>
类似于元素,属性也有数据类型,比如press元素的数据类型是“idref”。还没有讨论过该数据类型,以及其他两个相关的数据类型“id”和“idrefs”,数据类型是“id”的属性在文档实例中保留有标识值,该值不会再出现在文档中任何其他的id属性中。“idref”类型的属性是用匹配的id值来引用元素。“Idrefs”类似“idref”,但有一系列用空格分开的id值,例如:
press ="address1"
authors="author1 author2"
在某些方面属性比元素更受限制,属性不能包含子元素,不能要求属性以特殊的顺序出现,也不能指定两者择一(例如phone或workphone),可以说明一个属性是必需的还是可选的,但在一个元素中一个属性只能出现一次。
同时,属性也有一些元素不具备的性能。例如属性值可以被限定一个字符串集,也能指定属性省略时的缺省值。最重要的是,不同的元素类型可以有同名的属性,而这些属性被认为是独立不相关的。
可以使用required来定义该属性是否一定要包含在元素中,yes表示一定要包含,no表示不一定要包含。例如下面所示的代码指定属性不可选而是必需的:
<AttributeType name="press" dt:type="idref" required="yes"/>
要限制属性值是一短列表中的词,可以按照如下所示的方法操作:
<AttributeType name="colors" dt:type="enumeration" dt:values="red
                                                       green blue"/>
default设定属性的默认值。必须注意的是,default的值也必须符合AttributeType中其他对数据结构的定义。要给属性值赋缺省值,则要按照下面所示的代码编写。
<AttributeType name="quantity" dt:type="int" default="1"/>
10.2.5  注释
XML Schema中的注释与其他(如CSS、XSL)中注释方法不一样。如在CSS,XSL中的注意是放置在<!-和->之间,而XML Schema中的注释是放置在<description>和</description>之间,用于说明Schema的定义内容。例如下面的代码演示了如何在大纲中使用注释。
<ElementType name="Book">
    <description>
      This is how we describe the books we sell. Be sure to specify the group1!
    </description>
    <element type="group1">
        <default>adult</default>
    </element>
</ElementType>

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.