XML Schema使用技巧——key和keyref

      XML Schema可以通过将一个元素或属性定义为key,从而保证该元素或属性在一定范围内的唯一性。在XML实例文档中,key所代表的元素或属性的值组成一个集合,可以通过keyref来限定另一个元素或属性的值必须在这个集合中。

      key的定义方法和unique的定义方法十分相似。首先选择一组元素做为范围,然后依据上下文关系指定某元素或属性为key。keyref的定义跟key的定义基本相同,唯一区别在于增加了refkey属性来引用key。

  1. <?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实例:

  1. <?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">
    
  2. <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>
posted @ 2010-01-10 02:42 Asharp 阅读(...) 评论(...) 编辑 收藏