在Xml Schema中有3种一致性约束,分别是unique约束、key约束、keyref约束。
uniquek约束
使用xs:unique元素约束,用于指定任意的元素或属性在某个范围内是唯一的。该元素有一个必须的属性name,用于指定unique约束的名称。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="company" type="companyType">
<xs:unique name="numberUnique">
<xs:selector xpath="dept/employee"/>
<xs:field xpath="number"/>
</xs:unique>
</xs:element>
<xs:complexType name="companyType">
<xs:sequence>
<xs:element name="dept" type="deptType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="deptType">
<xs:sequence>
<xs:element name="employee" type="employeeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="employeeType">
<xs:sequence>
<xs:element name="number" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
unique示例1(元素约束)
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Unique.xsd">
<dept>
<employee>
<number>1-01</number>
<name>AA</name>
</employee>
<employee>
<number>1-02</number>
<name>AB</name>
</employee>
</dept>
<dept>
<employee>
<number>2-01</number>
<name>BA</name>
</employee>
<employee>
<number>2-02</number>
<name>BB</name>
</employee>
</dept>
</company>
Xml示例1(元素约束)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="company" type="companyType">
<xs:unique name="numberUnique">
<xs:selector xpath="*/employee"/>
<xs:field xpath="number"/>
<!--属性字段-->
<xs:field xpath="@deptID"/>
</xs:unique>
</xs:element>
<xs:complexType name="companyType">
<xs:sequence>
<xs:element name="dept" type="deptType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="deptType">
<xs:sequence>
<xs:element name="employee" type="employeeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="employeeType">
<xs:sequence>
<xs:element name="number" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
<xs:attribute name="deptID" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
unique示例2(元素、属性约束)
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Unique.xsd">
<dept>
<employee deptID="1">
<number>1-1</number>
<name>A</name>
</employee>
<employee deptID="2">
<number>1-1</number>
<name>A</name>
</employee>
</dept>
</company>
XML示例2(元素、属性约束)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.jwt.com/company" elementFormDefault="qualified" xmlns:com="http://www.jwt.com/company">
<xs:element name="Company" type="com:CompanyType">
<xs:unique name="NameUnique">
<!--此处需要加上com前缀,否则无法定位-->
<xs:selector xpath="com:Comployee"/>
<xs:field xpath="com:Name"/>
</xs:unique>
</xs:element>
<xs:complexType name="CompanyType">
<xs:sequence>
<xs:element name="Comployee" type="com:CompolyeeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="CompolyeeType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
模式文件(有命名空间)
<?xml version="1.0" encoding="UTF-8"?>
<Company xmlns="http://www.jwt.com/company" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jwt.com/company
XS_UniqueNamespace.xsd">
<Comployee>
<Name>ZS</Name>
<Age>29</Age>
</Comployee>
<Comployee>
<Name>LS</Name>
<Age>30</Age>
</Comployee>
</Company>
XML文件(引用上面XSD文件)
Key约束
Key约束与unique约束类似,他们之间的区别是,key约束指定的元素或属性不能是可选的,他们在文档中必须是寻在的。对于那些可选的元素或属性,可以是用unique约束。该约束有一个必须的属性name,用于指定key约束的名称。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="company" type="companyType">
<xs:key name="nameKey">
<xs:selector xpath="comployee"/>
<xs:field xpath="name"/>
</xs:key>
</xs:element>
<xs:complexType name="companyType">
<xs:sequence>
<xs:element name="comployee" type="comployeeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="comployeeType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
keyref约束
keyref约束必须和unique约束和key约束一起使用,用于在两个数据之间建立一种引用关系,这种关系类似于数据库表之间的主外键关系,unique和key类似于数据库的主键,keyref约束类似于数据库的外键约束。该元素带有两个必须的属性name和refer。name用于指定keyref约束的名称,refer属性指定在模式文档中定义的unique和key约束的名称。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="company" type="companyType">
<xs:key name="nameKey">
<xs:selector xpath="comployee"/>
<xs:field xpath="name"/>
</xs:key>
<xs:keyref refer="nameKey" name="managerKeyRef">
<xs:selector xpath="comployee"/>
<xs:field xpath="manager"/>
</xs:keyref>
</xs:element>
<xs:complexType name="companyType">
<xs:sequence>
<xs:element name="comployee" type="comployeeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="comployeeType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="manager" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Keyref.xsd">
<comployee>
<name>ZS</name>
<age>29</age>
</comployee>
<comployee>
<name>LS</name>
<age>28</age>
<manager>ZS</manager>
</comployee>
<comployee>
<name>WW</name>
<age>27</age>
<manager>ZS</manager>
</comployee>
</company>