现在的位置: 首页 > 综合 > 正文

理解XML Schema: XML Schema初步 (六)

2013年10月16日 ⁄ 综合 ⁄ 共 3985字 ⁄ 字号 评论关闭
 

十四anyType

 

 

anyType表示一个称为ur-type的抽象,它是导出所有简单类型和复合类型的基类型。一个anyType类型不以任何形式约束其包含的内容。我们可以象使用其他类型一样,使用anyType,如: <xsd:element name="anything" type="xsd:anyType"/>

 

用这个方式声明的元素是不受约束的。所以元素的值可以为423.46,也可以为任何其他的字符序列,或者甚至是字符和元素的混合。实际上,anyType是默认类型,所以上面的可以被重写为:

<xsd:element name="anything"/>

 

如果需要表示不受约束的元素内容,举例来说在元素包含散文,其中可能需要嵌入标签来支持国际化的表示,那么默认的声明(无约束)或者有些微约束的形式会很合适。

 

 

十五注释

 

 

为了方便其他读者和应用来理解模式文档,XML Schema提供了三个元素用来注释。在购买订单模式文档中,我们在documentation元素中放置了一个基本的模式描述和版权信息,这是放置适合人阅读的信息的推荐位置。我们推荐你在任何的documentation元素中使用xml:lang属性来表示这些描述信息使用的语言。另一个替代的方式是,你可以通过在schema元素中放置xml:lang属性来指明语言信息。

 

我们并没有在购买订单模式文档中使用元素appInfo,这个元素能够用来为工具、样式表和其他应用提供信息。在XML Schema Part 2:Datatypes中有一个描述简单类型的模式文档,它就是一个使用appInfo很有趣的例子。documentation和 appInfo是作为annotation元素的子元素出现的,这个元素自己出现在大多数schema构造的开头。为了显示这点,下面的例子显示了如何在元素声明开头使用annotation元素声明,这是一个复合类型的定义(参见下图)。

 

<xsd:element name="internationalPrice">

 <xsd:annotation>

  <xsd:documentation xml:lang="en">

      element declared with anonymous type

  </xsd:documentation>

 </xsd:annotation>

 <xsd:complexType>

  <xsd:annotation>

   <xsd:documentation xml:lang="en">

       empty anonymous type with 2 attributes

   </xsd:documentation>

  </xsd:annotation>

  <xsd:complexContent>

   <xsd:restriction base="xsd:anyType">

    <xsd:attribute name="currency" type="xsd:string"/>

    <xsd:attribute name="value" type="xsd:decimal"/>

   </xsd:restriction>

  </xsd:complexContent>

 </xsd:complexType>

</xsd:element>

 

 

 

annotation元素也会出现在其他模式构造的开头,如那些通过元素schema、simpleType和attribute来展示的模式构造。

 

 

十六构造内容模型

 

 

在购买订单模式文档中复合类型的定义都是定义了一系列的元素,这些元素在实例文档中都必须出现。在这些类型的内容模型中,单个元素的是否出现是可选的,这我们可以通过属性值"minOccurs=0'(如在comment中)来实现。当然我们也可以通过对minOccurs和maxOccurs赋予不同的值来实施其他不同的约束限制。XML Schema也支持对在内容模型中出现的元素组的约束。我们需要注意的是,约束是不能应用在属性声明上的。XML Schema允许定义和命名元素组。所以元素能够用来建立复合类型的内容模型,未命名的元素组也能够和命名的元素组一起被定义。他们能够被约束为他们以声明中的相同顺序序列在实例文档中出现。或者,他们能够被约束为只有一个元素可以出现在实例文档里面。

 

为了显示这点,我们在购买订单模式文档中的purchaseOrderType定义中引入两个元素组定义。这样,购买订单就可以有两种选择来描述地址:第一种是包含彼此独立的送货地址和收款地址,第二种情况则是仅包含一个简单的地址,这个地址即是送货地址也是收款地址(参见下图)。

 

<xsd:complexType name="PurchaseOrderType">

 <xsd:sequence>

  <xsd:choice>

   <xsd:group ref="shipAndBill"/>

   <xsd:element name="singleUSAddress" type="USAddress"/>

  </xsd:choice>

  <xsd:element ref="comment" minOccurs="0"/>

  <xsd:element name="items"  type="Items"/>

 </xsd:sequence>

 <xsd:attribute name="orderDate" type="xsd:date"/>

</xsd:complexType>

<xsd:group name="shipAndBill">

  <xsd:sequence>

    <xsd:element name="shipTo" type="USAddress"/>

    <xsd:element name="billTo" type="USAddress"/>

  </xsd:sequence>

</xsd:group>

 

 

 

对于choice组元素而言,在实例中仅仅允许出现这个组中的一个子内容。对于上图中的例子而言,第一个子内容是一个内部group元素,引用以shipAndBill命名的元素组,这个元素组由元素序列shipTo、billTo组成。第二个子内容为singleUSAddress。因此,在一个实例文档中,purchaseOrder元素必须,要么包含一个billTo元素和一个shipTo元素,要么包含一个singleUSAddress元素。choice组后面跟着的是comment和items元素声明。元素和组的声明都是sequence 组的子内容。这样定义的效果是comment和items元素必须按顺序跟在地址元素后面。

 

现在有第三种选择在组中包含元素:通过使用all元素定义的元素组,在组中所有的元素都可以出现一次或者更本不出现,而且他们能够以任何顺序出现。all组被限制放在任何内容模型的顶部,此外,all元素组的子内容必须都为独立元素(不能有组元素),在all元素定义的内容模型中的元素都不可以出现超过一次,也就是说minOccurs 和maxOccurs允许的值为"0"和"1"。举例来说,为了允许purchaseOrder的子元素以任意的顺序出现,我们能够用下面的形式重新定义purchaseOrderType(参见下图):

 

<xsd:complexType name="purchaseOrderType">

  <xsd:all>

    <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:all>

  <xsd:attribute name="orderDate" type="xsd:date"/>

</xsd:complexType>

 

 

 

通过使用这个定义,一个comment元素可以选择出现在purchaseOrder中的不同位置,可以在shipTo、billTo和items元素之前或者之后出现,但他只能够出现一次。而且all组的约束不允许我们在组外面声明一个元素,因为这样可以允许它出现超过一次。XML Schema限制所有的all组必须作为内容顶部的唯一子元素出现,换句话说,下面的形式是不合法的(参见下图):

 

<xsd:complexType name="PurchaseOrderType">

 <xsd:sequence>

  <xsd:all>

    <xsd:element name="shipTo" type="USAddress"/>

    <xsd:element name="billTo" type="USAddress"/>

    <xsd:element name="items"  type="Items"/>

  </xsd:all>

  <xsd:sequence>

   <xsd:element ref="comment" minOccurs="0" maxOccurs="unbounded"/>

  </xsd:sequence>

 </xsd:sequence>

 <xsd:attribute name="orderDate" type="xsd:date"/>

</xsd:complexType>

 

 

 

最后,在内容模型中被命名或未被命名的元素组(分别由group、choice、sequence、all所表现)可以带有minOccurs 和maxOccurs属性。通过使用这些特性,XML Schema可以完全表现DTD所能表现的功能。而且,all组也提供了额外的表达能力。

抱歉!评论已关闭.