一、Include

        使用Include引入时,要么引入和被引入的Schema都没有目标命名空间,要么他们具有的目标命名空间是相同的。


    1、都没有命名空间

        (1)定义Address的Schema(include_nons_address.xsd)如下:


<?xml version="1.0" encoding="UTF-8"?>
<!-- 如果当前的schema没有命名空间时,需要把默认的XMLSchema的命名空间设置别名 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

	<xs:element name="address" type="addressType"/> <!-- 定义根元素customer  -->
	
	<xs:complexType name="addressType"> <!-- 定义address的数据类型  -->
		<xs:sequence>
			<xs:element name="code" type="codeType" /> <!-- 定义address的code子元素,数据类型引用codeType的定义 -->
			<xs:element name="info" type="infoType"/> <!-- 定义address的info子元素,数据类型引用infoType的定义 -->
		</xs:sequence>
		<xs:attribute name="id" type="idType"/><!-- 定义address的id属性,数据类型引用idType的定义  -->
	</xs:complexType>

	<xs:simpleType name="idType">  <!-- 定义ID类型 -->
		<xs:restriction base="xs:int"> <!-- 定义限定条件,基于int的类型  -->
			<xs:minInclusive value="1" /> <!-- 最小值 -->
			<xs:maxInclusive value="999999999" /> <!-- 最大值  -->
		</xs:restriction>
	</xs:simpleType>
	
	<xs:simpleType name="codeType"> <!-- 定义Code的类型 -->
		<xs:restriction base="xs:string"> <!-- 定义限定条件,基于string的类型  -->
			<xs:pattern value="[0-9]*"/>
			<xs:length value="6"/> <!-- 定义最小长度 -->
		</xs:restriction>
	</xs:simpleType>
	
	<xs:simpleType name="infoType" > <!-- 定义Info的类型 -->
		<xs:restriction base="xs:string"> <!-- 定义限定条件,基于string的类型  -->
			<xs:minLength value="0"/> <!-- 定义最小长度 -->
			<xs:maxLength value="255"/> <!-- 定义最大长度 -->
		</xs:restriction>
	</xs:simpleType>
</xs:schema>

        (2)定义Customer的Schema(include_nons_customer.xsd),引入Address,如下:


<?xml version="1.0" encoding="UTF-8"?>
<!-- 如果当前的schema没有命名空间时,需要把默认的XMLSchema的命名空间设置别名 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
	
	<!-- 通过include引入没有命名空间的address的schema -->	
	<xs:include schemaLocation="include_nons_address.xsd"/>
	
	 <!-- 定义当前命名空间的根元素customer  -->
	<xs:element name="customer" type="customerType"/>

	<xs:complexType name="customerType"> <!-- 定义customer的数据类型  -->
		<xs:sequence>
			<xs:element name="name" type="nameType"/> <!-- 定义customer的name子元素,数据类型引用nameType的定义 -->
			<xs:element name="age" type="ageType" /> <!-- 定义customer的age元素,的数据类型引用ageType的定义 -->
			<xs:element name="sex" type="sexType" /> <!-- 定义customer的sex子元素,的数据类型引用sexType的定义 -->
			<xs:element name="addresses" type="addressesType"/>
		</xs:sequence>
		<xs:attribute name="id" type="idType"/> <!-- 定义customer的属性,数据类型重用address中的idType的定义 -->
	</xs:complexType>
	
	<xs:simpleType name="nameType"> <!-- 定义Customer的Name -->
		<xs:restriction base="xs:string">
			<xs:pattern value="[a-zA-Z][_a-zA-Z0-9]*" /> <!-- 定义正则来规范名称 -->
			<xs:minLength value="3" /> <!-- 定义最小长度 -->
			<xs:maxLength value="18" /> <!-- 定义最大长度 -->
		</xs:restriction>
	</xs:simpleType>
	
	<xs:simpleType name="ageType"> <!-- 定义age的类型  -->
		<xs:restriction base="xs:int"> <!-- 定义限定条件,基于int的类型 -->
			<xs:minInclusive value="0" /><!-- 最小包含0 -->
			<xs:maxExclusive value="150" /><!-- 最大不包含150 -->
		</xs:restriction>
	</xs:simpleType>
	
	<xs:simpleType name="sexType"> <!-- 定义sex的类型  -->
		<xs:restriction base="xs:string"> <!-- 定义限定条件,基于string的类型  -->
			<xs:enumeration value="MAN" /> <!-- 定义sex为枚举,只可以选择其一 -->
			<xs:enumeration value="WOMAN" /> 		
			<xs:enumeration value="OTHER" /> 		
		</xs:restriction>
	</xs:simpleType>
	
	<xs:complexType name="addressesType"> <!-- 定义addresses的类型 -->
		<xs:sequence minOccurs="1" maxOccurs="4">
			<xs:element name="address" type="addressType"/> <!-- 引用address中的addressType -->
		</xs:sequence>
	</xs:complexType>
</xs:schema>



        (3)使用Customer的Schema(include_nons_customer.xsd)生成xml如下:


<?xml version="1.0" encoding="UTF-8"?>
<!-- 通过xsi:noNamespaceSchemaLocation指定Schema -->
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="include_nons_customer.xsd" id="1">
	<name>Tom</name>
	<age>25</age>
	<sex>MAN</sex>
	<addresses>
		<address id="1">
			<code>100000</code>
			<info>BeiJing</info>
		</address>
		<address id="2">
			<code>510000</code>
			<info>GuangZhou</info>
		</address>
	</addresses>
</customer>


    2、具有相同的命名空间

        (1)定义Address的Schema(include_eqns_address.xsd)如下:


<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	targetNamespace="http://www.xilen.com/crm":设置当前Schema的命名空间
	xmlns:crm="http://www.xilen.com/crm":将当前命名空间别名为crm 
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  
	targetNamespace="http://www.xilen.com/crm" xmlns:crm="http://www.xilen.com/crm">

	<element name="address" type="crm:addressType"/> <!-- 定义根元素customer  -->
	
	<complexType name="addressType"> <!-- 定义address的数据类型  -->
		<sequence>
			<element name="code" type="crm:codeType" /> <!-- 定义address的code子元素,数据类型引用codeType的定义 -->
			<element name="info" type="crm:infoType"/> <!-- 定义address的info子元素,数据类型引用infoType的定义 -->
		</sequence>
		<attribute name="id" type="crm:idType"/><!-- 定义address的id属性,数据类型引用idType的定义  -->
	</complexType>
	
	<simpleType name="idType">  <!-- 定义ID类型 -->
		<restriction base="int"> <!-- 定义限定条件,基于int的类型  -->
			<minInclusive value="1" /> <!-- 最小值 -->
			<maxInclusive value="999999999" /> <!-- 最大值  -->
		</restriction>
	</simpleType>
	
	<simpleType name="codeType"> <!-- 定义Code -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<pattern value="[0-9]*"/>
			<length value="6"/> <!-- 定义最小长度 -->
		</restriction>
	</simpleType>
	
	<simpleType name="infoType" > <!-- 定义Info的类型 -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<minLength value="0"/> <!-- 定义最小长度 -->
			<maxLength value="255"/> <!-- 定义最大长度 -->
		</restriction>
	</simpleType>
</schema>


        (2)定义Customer的Schema( include_eqns_customer.xsd ),引入Address,如下:


<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	targetNamespace="http://www.xilen.com/crm":设置当前Schema的命名空间,和address相同 
	xmlns:crm="http://www.xilen.com/crm":将当前命名空间别名为crm
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  
	targetNamespace="http://www.xilen.com/crm" xmlns:crm="http://www.xilen.com/crm">
	
	<!-- 通过include引入相同命名空间的address的schema -->	
	<include schemaLocation="include_eqns_address.xsd"/>
	
	 <!-- 定义当前命名空间的根元素customer  -->
	<element name="customer" type="crm:customerType"/>

	<complexType name="customerType"> <!-- 定义customer的数据类型  -->
		<sequence>
			<element name="name" type="crm:nameType"/> <!-- 定义customer的name子元素,数据类型引用nameType的定义 -->
			<element name="age" type="crm:ageType" /> <!-- 定义customer的age元素,的数据类型引用ageType的定义 -->
			<element name="sex" type="crm:sexType" /> <!-- 定义customer的sex子元素,的数据类型引用sexType的定义 -->	
			<element name="addresses" type="crm:addressesType"/>
		</sequence>
		<attribute name="id" type="crm:idType"/> <!-- 定义customer的属性,数据类型重用address中的idType的定义 -->
	</complexType>
	
	<simpleType name="nameType"> <!-- 定义Customer的Name -->
		<restriction base="string">
			<pattern value="[a-zA-Z][_a-zA-Z0-9]*" /> <!-- 定义正则来规范名称 -->
			<minLength value="3" /> <!-- 定义最小长度 -->
			<maxLength value="18" /> <!-- 定义最大长度 -->
		</restriction>
	</simpleType>
	
	<simpleType name="ageType"> <!-- 定义age的类型  -->
		<restriction base="int"> <!-- 定义限定条件,基于int的类型 -->
			<minInclusive value="0" /><!-- 最小包含0 -->
			<maxExclusive value="150" /><!-- 最大不包含150 -->
		</restriction>
	</simpleType>
	
	<simpleType name="sexType"> <!-- 定义sex的类型  -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<enumeration value="MAN" /> <!-- 定义sex为枚举,只可以选择其一 -->
			<enumeration value="WOMAN" /> 		
			<enumeration value="OTHER" /> 		
		</restriction>
	</simpleType>
	
	<complexType name="addressesType"> <!-- 定义addresses的类型 -->
		<sequence minOccurs="1" maxOccurs="4">
			<element name="address" type="crm:addressType"/> <!-- 引用address中的addressType -->
		</sequence>
	</complexType>
</schema>


        (3)使用Customer的Schema ( include_eqns_customer.xsd ) 生成xml如下:


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

<!-- 引入customer的Schema,并将其和address相同的命名空间作为默认空间 -->
<customer xmlns="http://www.xilen.com/crm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.xilen.com/crm include_eqns_customer.xsd"
	id="1">
	<name>Tom</name>
	<age>25</age>
	<sex>MAN</sex>
	<addresses>
		<address id="1">
			<code>100000</code>
			<info>BeiJing</info>
		</address>
		<address id="2">
			<code>510000</code>
			<info>GuangZhou</info>
		</address>
	</addresses>
</customer>


二、Import

Import尽用于引入具有不同命名空间的Schema。

    1、定义Address的Schema(import_address.xsd)如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns:address="http://www.xilen.com/address":将当前命名空间别名为address -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  
	targetNamespace="http://www.xilen.com/address" xmlns:address="http://www.xilen.com/address">

	<element name="address" type="address:addressType"/> <!-- 定义根元素customer  -->
	
	<complexType name="addressType"> <!-- 定义address的数据类型  -->
		<sequence>
			<element name="code" type="address:codeType" /> <!-- 定义address的code子元素,数据类型引用codeType的定义 -->
			<element name="info" type="address:infoType"/> <!-- 定义address的info子元素,数据类型引用infoType的定义 -->
		</sequence>
		<attribute name="id" type="address:idType"/><!-- 定义address的id属性,数据类型引用idType的定义  -->
	</complexType>

	<simpleType name="idType">  <!-- 定义ID类型 -->
		<restriction base="int"> <!-- 定义限定条件,基于int的类型  -->
			<minInclusive value="1" /> <!-- 最小值 -->
			<maxInclusive value="999999999" /> <!-- 最大值  -->
		</restriction>
	</simpleType>
	
	<simpleType name="codeType"> <!-- 定义Code -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<pattern value="[0-9]*"/>
			<length value="6"/> <!-- 定义最小长度 -->
		</restriction>
	</simpleType>
	
	<simpleType name="infoType" > <!-- 定义Info的类型 -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<minLength value="0"/> <!-- 定义最小长度 -->
			<maxLength value="255"/> <!-- 定义最大长度 -->
		</restriction>
	</simpleType>
</schema>


    2、 定义Customer的Schema( import_customer.xsd ),引入Address,如下:


<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	xmlns:customer="http://www.xilen.com/customer":将当前命名空间别名为customer
	xmlns:address="http://www.xilen.com/address" : 将引入的address的schema的命名空间别名为address
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  
	targetNamespace="http://www.xilen.com/customer" xmlns:customer="http://www.xilen.com/customer"
	xmlns:address="http://www.xilen.com/address">
	
	<!-- 引入address的schema -->
	<import namespace="http://www.xilen.com/address" schemaLocation="import_address.xsd"/>
	
	 <!-- 定义当前命名空间的根元素customer  -->
	<element name="customer" type="customer:customerType"/>

	<complexType name="customerType"> <!-- 定义customer的数据类型  -->
		<sequence>
			<element name="name" type="customer:nameType"/> <!-- 定义customer的name子元素,数据类型引用nameType的定义 -->
			<element name="age" type="customer:ageType" /> <!-- 定义customer的age元素,的数据类型引用ageType的定义 -->
			<element name="sex" type="customer:sexType" /> <!-- 定义customer的sex子元素,的数据类型引用sexType的定义 -->			
			<element name="addresses" type="customer:addressesType"/>
		</sequence>
		<attribute name="id" type="address:idType"/> <!-- 定义customer的属性,数据类型重用address中的idType的定义 -->
	</complexType>
	
	<simpleType name="nameType"> <!-- 定义Name -->
		<restriction base="string">
			<pattern value="[a-zA-Z][_a-zA-Z0-9]*" /> <!-- 定义正则来规范名称 -->
			<minLength value="3" /> <!-- 定义最小长度 -->
			<maxLength value="18" /> <!-- 定义最大长度 -->
		</restriction>
	</simpleType>
	
	<simpleType name="ageType"> <!-- 定义age的类型  -->
		<restriction base="int"> <!-- 定义限定条件,基于int的类型 -->
			<minInclusive value="0" /><!-- 最小包含0 -->
			<maxExclusive value="150" /><!-- 最大不包含150 -->
		</restriction>
	</simpleType>
	
	<simpleType name="sexType"> <!-- 定义sex的类型  -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<enumeration value="MAN" /> <!-- 定义sex为枚举,只可以选择其一 -->
			<enumeration value="WOMAN" /> 		
			<enumeration value="OTHER" /> 		
		</restriction>
	</simpleType>
	
	<complexType name="addressesType"> <!-- 定义addresses的类型 -->
		<sequence minOccurs="1" maxOccurs="4">
			<element name="address" type="address:addressType"/> <!-- 引用address中的addressType -->
		</sequence>
	</complexType>
</schema>


    3、使用Customer的Schema(import_customer.xsd)生成xml如下:


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

<!-- 
	xmlns="http://www.xilen.com/customer":将customer的命名空间作为默认的命名空间 
	xmlns:address="http://www.xilen.com/address":将address这个在customer中引用到的命名空间别名为address 
	xsi:schemaLocation="http://www.xilen.com/customer customer.xsd" 通过Schema构造器指定customer的路径 
-->
<customer xmlns="http://www.xilen.com/customer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:address="http://www.xilen.com/address" xsi:schemaLocation="http://www.xilen.com/customer customer.xsd"
	id="1">
	<name>Tom</name>
	<age>25</age>
	<sex>MAN</sex>
	<addresses>
		<address id="1">
			<address:code>100000</address:code>
			<address:info>BeiJing</address:info>
		</address>
		<address id="2">
			<address:code>510000</address:code>
			<address:info>GuangZhou</address:info>
		</address>
	</addresses>
</customer>


三、Redefine


   可以对引入的Schema中的组件在这个元素里面进行重新定义(扩展或限制)。如果没有重定义元素,功能和Include等同。注意:可以进行重定义的元素尽简单类型、复杂类型、元素组和属性组。

    1、定义Address的Schema(redefine_address.xsd)如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	targetNamespace="http://www.xilen.com/crm":设置当前Schema的命名空间
	xmlns:crm="http://www.xilen.com/crm":将当前命名空间别名为crm 
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  
	targetNamespace="http://www.xilen.com/crm" xmlns:crm="http://www.xilen.com/crm">

	<element name="address" type="crm:addressType"/> <!-- 定义根元素customer  -->
	
	<complexType name="addressType"> <!-- 定义address的数据类型  -->
		<sequence>
			<element name="code" type="crm:codeType" /> <!-- 定义address的code子元素,数据类型引用codeType的定义 -->
			<element name="info" type="crm:infoType"/> <!-- 定义address的info子元素,数据类型引用infoType的定义 -->
		</sequence>
		<attribute name="id" type="crm:idType"/><!-- 定义address的id属性,数据类型引用idType的定义  -->
	</complexType>
	
	<simpleType name="idType">  <!-- 定义ID类型 -->
		<restriction base="int"> <!-- 定义限定条件,基于int的类型  -->
			<minInclusive value="1" /> <!-- 最小值 -->
			<maxInclusive value="999999999" /> <!-- 最大值  -->
		</restriction>
	</simpleType>
	
	<simpleType name="codeType"> <!-- 定义Code -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<pattern value="[0-9]*"/>
			<length value="6"/> <!-- 定义最小长度 -->
		</restriction>
	</simpleType>
	
	<simpleType name="infoType" > <!-- 定义Info的类型 -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<minLength value="0"/> <!-- 定义最小长度 -->
			<maxLength value="255"/> <!-- 定义最大长度 -->
		</restriction>
	</simpleType>
</schema>

    2、定义Customer的Schema(redefine_customer.xsd),引入Address,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	targetNamespace="http://www.xilen.com/crm":设置当前Schema的命名空间,和address相同 
	xmlns:crm="http://www.xilen.com/crm":将当前命名空间别名为crm
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  
	targetNamespace="http://www.xilen.com/crm" xmlns:crm="http://www.xilen.com/crm">
	
	<!-- 通过redefine引入相同命名空间的address的schema -->	
	<redefine schemaLocation="redefine_address.xsd">
		<!-- 对address中的addressType进行扩展,添加node子元素 -->
		<complexType name="addressType">
			<complexContent>
				<extension base="crm:addressType">
					<sequence>
						<element name="note" type="string"/>
					</sequence>
				</extension>
			</complexContent>
		</complexType>
	</redefine>
	
	 <!-- 定义当前命名空间的根元素customer  -->
	<element name="customer" type="crm:customerType"/>

	<complexType name="customerType"> <!-- 定义customer的数据类型  -->
		<sequence>
			<element name="name" type="crm:nameType"/> <!-- 定义customer的name子元素,数据类型引用nameType的定义 -->
			<element name="age" type="crm:ageType" /> <!-- 定义customer的age元素,的数据类型引用ageType的定义 -->
			<element name="sex" type="crm:sexType" /> <!-- 定义customer的sex子元素,的数据类型引用sexType的定义 -->	
			<element name="addresses" type="crm:addressesType"/>
		</sequence>
		<attribute name="id" type="crm:idType"/> <!-- 定义customer的属性,数据类型重用address中的idType的定义 -->
	</complexType>
	
	<simpleType name="nameType"> <!-- 定义Customer的Name -->
		<restriction base="string">
			<pattern value="[a-zA-Z][_a-zA-Z0-9]*" /> <!-- 定义正则来规范名称 -->
			<minLength value="3" /> <!-- 定义最小长度 -->
			<maxLength value="18" /> <!-- 定义最大长度 -->
		</restriction>
	</simpleType>
	
	<simpleType name="ageType"> <!-- 定义age的类型  -->
		<restriction base="int"> <!-- 定义限定条件,基于int的类型 -->
			<minInclusive value="0" /><!-- 最小包含0 -->
			<maxExclusive value="150" /><!-- 最大不包含150 -->
		</restriction>
	</simpleType>
	
	<simpleType name="sexType"> <!-- 定义sex的类型  -->
		<restriction base="string"> <!-- 定义限定条件,基于string的类型  -->
			<enumeration value="MAN" /> <!-- 定义sex为枚举,只可以选择其一 -->
			<enumeration value="WOMAN" /> 		
			<enumeration value="OTHER" /> 		
		</restriction>
	</simpleType>
	
	<complexType name="addressesType"> <!-- 定义addresses的类型 -->
		<sequence minOccurs="1" maxOccurs="4">
			<element name="address" type="crm:addressType"/> <!-- 引用address中的addressType -->
		</sequence>
	</complexType>
</schema>

    3、使用Customer的Schema(redefine_customer.xsd)生成xml如下:


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

<!-- 引入customer的Schema,并将其和address相同的命名空间作为默认空间 -->
<customer xmlns="http://www.xilen.com/crm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.xilen.com/crm redefine_customer.xsd"
	id="1">
	<name>Tom</name>
	<age>25</age>
	<sex>MAN</sex>
	<addresses>
		<address id="1">
			<code>100000</code>
			<info>BeiJing</info>
			<note>Home Address</note>
		</address>
		<address id="2">
			<code>510000</code>
			<info>GuangZhou</info>
			<note>Office Address</note>
		</address>
	</addresses>
</customer>