XML Schema使用技巧——key和keyref
XML Schema可以通过将一个元素或属性定义为key,从而保证该元素或属性在一定范围内的唯一性。在XML实例文档中,key所代表的元素或属性的值组成一个集合,可以通过keyref来限定另一个元素或属性的值必须在这个集合中。
key的定义方法和unique的定义方法十分相似。首先选择一组元素做为范围,然后依据上下文关系指定某元素或属性为key。keyref的定义跟key的定义基本相同,唯一区别在于增加了refkey属性来引用key。
-
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.cnblogs.com" xmlns="http://www.cnblogs.com"> <xs:element name="bookInfo"> <xs:complexType> <xs:sequence> <xs:element name="bookSort" type="xs:string" maxOccurs="unbounded"/> <xs:element name="book" type="bookType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:key name="sortKey"> <xs:selector xpath="bookSort"/> <xs:field xpath="."/> </xs:key> <xs:keyref refer="sortKey" name="sortKeyRef"> <xs:selector xpath="book"></xs:selector> <xs:field xpath="@type"></xs:field> </xs:keyref> <xs:unique name="maneUnique"> <xs:selector xpath="book"></xs:selector> <xs:field xpath="name"></xs:field> </xs:unique> </xs:element> <xs:complexType name="bookType"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="quantity" type="xs:integer"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> <xs:attribute name="type" type="xs:string"/> </xs:complexType> </xs:schema>
<xs:key name="sortKey"> 用于声明一个key。name=’sortKey’表明key的名字,<xs:selector xpath="bookSort"/> 用于指定元素的范围,由于sortKey定义在元素bookInfo声明之内,元素bookSort是元素bookInfo的子元素。<xs:field xpath="."/> 用于指定对元素bookSort本身进行唯一性约束。
<xs:keyref refer="sortKey" name="sortKeyRef"> 用于什么一个keyref。refer="sortKey" 表示它要引用的key是sortKey。<xs:selector xpath="book"></xs:selector> 指定元素的范围。<xs:field xpath="@type"></xs:field> 表示在book元素下的属性type都必须是sortKey的一员。
xml实例:
-
<?xml version="1.0" encoding="UTF-8"?> <bookInfo xsi:schemaLocation="http://www.cnblogs.com t.xsd" xmlns:n1="http://www.cnblogs.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
<bookSort>technology</bookSort> <bookSort>novel</bookSort> <bookSort>history</bookSort> <book type="technology"> <name>XML Schema应用</name> <quantity>2</quantity> <price>20</price> </book> <book type="novel"> <name>疯狂程序员</name> <quantity>3</quantity> <price>15</price> </book> <book type="history"> <name>三国志</name> <quantity>1</quantity> <price>30</price> </book> </bookInfo>