在文档中引用派生类型
可以使用xsi:type属性来显示的标识类型,告诉模式处理器你使用哪个派生类型。xsi:type属性是XML Schema实例空间http://www.w3.org/2001/XMLSchema-instance。下面是一个例子,商店里的商品有图书和音像品之分。图书有页数,音像品有格式。他们都是一个共同的基类。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="NetStore" type="storeType"/>
<xs:complexType name="storeType">
<xs:sequence>
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element ref="Item" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="Item" type="itemType"/>
<xs:complexType name="itemType">
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="bookconcern" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="bookType">
<xs:complexContent>
<xs:extension base="itemType">
<xs:sequence>
<xs:element name="pageCount" type="xs:integer"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="videoType">
<xs:complexContent>
<xs:extension base="itemType">
<xs:sequence>
<xs:element name="format">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="VCD"/>
<xs:enumeration value="DVD"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
xs_instance.xsd
<?xml version="1.0" encoding="UTF-8"?>
<NetStore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Instance.xsd">
<Items>
<Item xsi:type="bookType">
<id>123</id>
<title>XML</title>
<bookconcern>北京出版社</bookconcern>
<pageCount>751</pageCount>
</Item>
<Item xsi:type="videoType">
<id>456</id>
<title>C#</title>
<bookconcern>上海出版社</bookconcern>
<format>DVD</format>
</Item>
<Item xsi:type="itemType">
<id>789</id>
<title>C++</title>
<bookconcern>杭州出版社</bookconcern>
</Item>
</Items>
</NetStore>
实例xml
替换组
XML Schema提供了一种机制,称为替换组(substitution group),允许在内容模型中声明的某个元素被其他元素所替换。替换组有头元素(head element)和替换成员组成,头元素和替换成员都必须是全局元素,有相同的类型,或都有头元素派生。替换成员需要使用一个特殊的属性sbustitutionGroup,用于指定要替换的头元素的名字。在内容模型中引用头元素,在实例文档中则用任意的替换组成员来替换头元素。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="NetStore" type="storeType"/>
<xs:complexType name="storeType">
<xs:sequence>
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element ref="Item" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!--全局声明的item元素作为替换组的头元素-->
<xs:element name="Item" type="itemType"/>
<!--全局声明的book和viedo元素作为替换组的成员。
使用substitutionGroup属性指定要替换的头元素-->
<xs:element name="book" type="bookType" substitutionGroup="Item"/>
<xs:element name="video" type="videoType" substitutionGroup="Item"/>
<xs:complexType name="itemType">
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="bookconcern" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!--bookType从itemType派生-->
<xs:complexType name="bookType">
<xs:complexContent>
<xs:extension base="itemType">
<xs:sequence>
<xs:element name="pageCount" type="xs:integer"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!--videoType从itemType派生-->
<xs:complexType name="videoType">
<xs:complexContent>
<xs:extension base="itemType">
<xs:sequence>
<xs:element name="format">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="VCD"/>
<xs:enumeration value="DVD"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
xs_substitution.xsd
<?xml version="1.0" encoding="UTF-8"?>
<NetStore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Substitution.xsd">
<Items>
<Item>
<id>123</id>
<title>C</title>
<bookconcern>北京人民出版社</bookconcern>
</Item>
<book>
<id>456</id>
<title>C++</title>
<bookconcern>上海人民出版社</bookconcern>
<pageCount>123</pageCount>
</book>
<video>
<id>789</id>
<title>C#</title>
<bookconcern>广州人民出版社</bookconcern>
<format>DVD</format>
</video>
</Items>
</NetStore>
xml_substitution.xml