全局声明和局部声明
直接在xs:schema元素下声明的元素和属性是全局的,这些元素和属性可以通过xs:element和xs :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中,声明的元素book、title和author,以及属性isbn都是全局的,在bookType类型定义中,我们通过xs:element和xs :attribute元素的ref属性来引用全局声明的元素和属性。
要注意的是:(1)全局声明的元素和属性的名称在模式中必须是唯一的。(2)在全局声明中不能使用ref属性。(3)全局声明的元素在实例文档中可以作为根元素出现。
在复杂类型定义内部声明的元素和属性是局部的,由于简单类型不能有子元素和属性,所以局部元素声明和局部属性声明不能出现在简单类型定义内部。我们将例4-14中的title、author元素,以及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>
现在title、author元素和isbn属性都是在bookType类型定义内部声明的,这些局部声明只能在bookType类型定义内部使用。
如果模式文档中所有声明的元素名都是唯一的,那么可以使用全局声明,然而,当有两个同名但具有不同类型的元素时,你就只能使用局部声明了。例如,你可以声明一个局部元素title,它有xs:token类型,而且它是book元素的子元素,在同一个模式文档中,你还可以声明一个局部元素title,它可带有枚举值"Mr Mrs Ms"。
对于属性而言,属性通常是附属于元素的,因此将属性声明为全局的意义不大,除非多个元素要使用相同的属性。
没有评论:
发表评论