扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月22日
关键字:
在本页阅读全文(共7页)
复合类型定义,元素和属性声明
在XML Schema中,对于允许元素有他们自己的内容以及可以携带自身属性的复合类型与那些不能够有元素内容和属性的简单类型之间,有着基本的不同。而在实例文档中,对于能建立新的类型(无论简单和复杂)的定义和允许元素和属性有特定的名字和类型(无论是简单还是复杂)的声明之间,也有着显著的差别。在这一节中,我们将针对如何定义复合类型,以及如何声明使用复合类型的元素及其属性。
新的复合类型使用complexType元素来定义,这样的定义典型的包含一组元素声明,元素引用和属性声明。这些元素声明与其说是它们自身的类型,不如说是一由相关模式控制的名与控制这些名在实例文档中的表现形式的约束之间的关联。元素使用element元素声明,同时属性使用attribute来声明。举例来说,USAddress被定义为一个复合类型并且在USAddress定义中我们看到五个元素的声明和一个属性的声明。
<xsd:complexType name="USAddress" >
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
</xsd:complexType>
这个定义的结果将是,在实例文档中出现的任何类型声明为USAddress的元素(比如在po.xml中的shiptTo)必须包含五个元素和一个属性。这些元素必须被命名为name、street、city、state和zip,这些名称就如同在模式声明中name属性的值所指的那样。并且这些属性必须按照模式声明中的同样的顺序出现。前四个元素必须包含一个字符串元素内容而第五个必须包含一个十进制数字类型的元素内容。声明为USAddress类型的元素可以带有一个country属性,该属性必须包含字符串"US".
USAddress类型定义仅仅包含引用简单类型的声明:string、decimal 和NMTOKEN.与之对比,PurchaseOrderType类型定义则包含了引用复合类型的元素声明,如USAddress,虽然两个类型声明都使用同样的type属性来标识类型,而无需管类型是简单的还是复合的。
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="shipTo" type="USAddress"/>
<xsd:element name="billTo" type="USAddress"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
在PurchaseOrderType的类型定义中,对于shipTo 和 billTo这两个子元素的声明,它们将不同的元素名字和相同的复合类型相关联,这个复合类型是USAddress.这个定义的结果是,如果在实例文档中出现的任何元素(如po.xml中),当元素类型被声明为PurchaseOrderType时,那么这个元素必须包含两个名为shipTo 和billTo的元素,这两个元素都要包含五个子元素(name、street、city、state和zip),这五个子元素是作为USAddress声明的一部分而出现的。应USAddress的相关类型定义,shipTo和billTo元素也可以包含country属性。
PurchaseOrderType类型定义包含了一个orderDate属性声明,就像在UAAddress中的country属性声明一样,它被标识为一个简单类型,实际上,所有的属性声明必须引用简单类型。这是因为不像元素声明,属性不能包含其他元素或者其他属性。迄今为止我们描述的元素声明对于每一个名字都和一个现存的类型定义相关联。然而有时候,使用一个现存的元素比定义一个新的元素更方便。
<xsd:element ref="comment" minOccurs="0"/>
这个声明定义引用了一个现存的元素comment,该元素在购买订单模式文档中的其他地方有定义。一般的来说,ref属性的值必须指向一个全局元素,一般来说,应当是在下面声明的而不是作为复合类型定义的一部分声明的。这个声明的结果为一个叫comment的元素可以出现在实例文档的关于这个定义的相关部分中,他的内容必须和那个被引用的元素的类型一致,在这个情况下是" string"。
出现约束
我们看到,在前面中的元素声明中minOccurs属性的值为0 ,所以comment元素在PurchaseOrderType类型中是一个可选项。一般的来说,当minOccurs的值为1或者更多时,一个元素就必须出现。一个元素可以出现的最大数量由声明中的maxOccurs属性所决定的。这个值也许是一个正的整型如41,或者以"unbounded"的形式来表明不限最大的出现数量。minOccurs和maxOccurs属性的默认值是1.因此,当一个元素如comment,没有定义maxOccurs属性,元素不可以出现超过一次。如果你仅仅指定了minOccurs属性的值,它必须小于等于maxOccurs的默认值,也就是说minOccurs如果单独出现,其取值只能为0或者1.同样的,如果你只指定了maxOccurs属性,它必须大于等于minOccurs的默认值,也就是必须取值为1或者更多。如果两个属性都被省略了,那么元素必须出现且仅出现一次。
而对于属性而言,它可以出现一次或者更本不出现,不会有其他的出现次数,所以指定属性出现次数的语法与元素的语法有所不同。特别的,属性声明能够使用一个use属性来指明属性是否需要出现(参阅po.xsd中partNum属性的声明)。
属性和元素的默认值都是使用default属性来声明,不过这个属性在不同的情况下有些许不同的语义表示结果。当一个属性使用默认值来声明的时候,如果属性在实例文档中出现了,那么属性的值就是属性在实例文档中出现的那个值。如果属性没有在实例文档中出现,模式 处理器将认为这个属性的值等于声明中default属性的值。需要注意的是,属性默认值只在属性本身为"可选的"时候才有意义,如果在声明中,即指定了默认值,同时又设置了use属性为除"optional"以外的其他值的话,处理器就会产生错误。
而当一个元素声明中有默认值定义的时候,模式处理器在处理默认的元素值的时候,与处理属性的默认值相比有一些不同。如果实例文档中元素出现且带有自身的内容的时候,元素的值就是是实例文档中元素的内容,如果元素没有内容,那么模式处理器就认为这个元素的值(内容)等于声明中default属性的值。然而,如果元素在实例文档中并不出现,模式处理器则更本不认为该元素出现。总而言之,元素和属性默认值之间的区别可以认为是:当属性不出现时默认的属性值被应用,当元素内容为空的时候,默认的元素值被应用。
属性和元素声明中都使用到fixed属性来确保属性和元素被设置为特殊的值,如po.xsd中包含了一个country属性的声明,这个country属性声明就有一个fixed属性,值为US.这个声明意味着在实例文档中country属性的出现是可选的(use属性的默认值是optional),但是如果属性出现,他的值必须为"US",如果属性不出现,模式处理器将自动设置country属性值为"US".需要注意的是,fixed值的概念和default值的概念是互斥的。所以如果同时声明fixed和default属性就会令模式处理器产生一个错误。
在元素和属性声明中用于约束他们出现行为的属性的值被概括地罗列在下表中:
元素 - 使用(minOccurs, maxOccurs) fixed, default 属性 - 使用use, fixed, default 注解
(1, 1) -, - required, -, - 元素/属性必须出现一次,它可以有任何值。
(1, 1) 37, - Required, 37, - 元素属性必须出现一次,他的值为37。
(2, unbounded) 37, - 无相关描述 元素必须出现两次或者多次,他的值必须为37,一般说来,minOccurs 和maxOccurs可以为正数,maxOccurs可以为"unbounded"。
(0, 1) -, - optional, -, - 元素/属性可以出现一次,他可以有任何值。
(0, 1) 37, - optional, 37, - 元素/属性可以出现一次,如果出现他的值必须为37,如果不出现他的值为37。
(0, 1) -, 37 optional, -, 37 元素/属性可以出现一次,如果不出现值为37,否则他的值为给出的值。
(0, 2) -, 37 无相关描述 元素可以出现一次、两次或者更本不出现,如果元素不出现,则默认值不发生作用,如果出现并且他为空元素,则其值为37,否则值为实例中给出的值。一般说来,minOccurs 和maxOccurs可以为正数,maxOccurs可以为"unbounded"。
(0, 0) -, - prohibited, -, - 元素/属性必须不出现。
在这里,值得注意的是,在全局的元素和属性声明中,minOccurs、maxOccurs、use都没有出现。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者