2009年12月28日星期一

XML Schema 中 全局声明和局部声明

全局声明和局部声明
直接在xs:schema元素下声明的元素和属性是全局的这些元素和属性可以通过xs:elementxs :attribute元素的ref属性来引用。我们看例4-14

4-14
book.xsd



<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">




<xs:element name="book" type="bookType"/>



<xs:element name="title" type="xs:token"/>



<xs:element name="author" type="xs:token"/>



<xs:attribute name="isbn" type="xs:token"/>





<xs:complexType name="bookType">



<xs:sequence>



<xs:element ref="title"/>



<xs:element ref="author"/>



</xs:sequence>



<xs:attribute ref="isbn"/>



</xs:complexType>


</xs:schema>



在例4-14中,声明的元素booktitleauthor,以及属性isbn都是全局的,在bookType类型定义中,我们通过xs:elementxs :attribute元素的ref属性来引用全局声明的元素和属性。

要注意的是:(1)全局声明的元素和属性的名称在模式中必须是唯一的。(2)在全局声明中不能使用ref属性。(3)全局声明的元素在实例文档中可以作为根元素出现。

在复杂类型定义内部声明的元素和属性是局部的,由于简单类型不能有子元素和属性,所以局部元素声明和局部属性声明不能出现在简单类型定义内部。我们将例4-14中的titleauthor元素,以及isbn属性改为局部声明,如例4-15所示。

4-15
book2.xsd



<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">


<xs:element name="book" type="bookType"/>





<xs:complexType name="bookType">



<xs:sequence>



<xs:element name="title" type="xs:token"/>



<xs:element name="author" type="xs:token"/>



</xs:sequence>



<xs:attribute name="isbn" type="xs:token"/>



</xs:complexType>


</xs:schema>



现在titleauthor元素和isbn属性都是在bookType类型定义内部声明的,这些局部声明只能在bookType类型定义内部使用。

如果模式文档中所有声明的元素名都是唯一的,那么可以使用全局声明,然而,当有两个同名但具有不同类型的元素时,你就只能使用局部声明了。例如,你可以声明一个局部元素title,它有xs:token类型,而且它是book元素的子元素,在同一个模式文档中,你还可以声明一个局部元素title,它可带有枚举值"Mr Mrs Ms"。

对于属性而言,属性通常是附属于元素的,因此将属性声明为全局的意义不大,除非多个元素要使用相同的属性。

没有评论: