MDA之路

MDA,UML,XML,Eclipse及Java相关的Blog
posts - 53, comments - 494, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

XMLSchema中的key和unique问题

Posted on 2005-01-21 19:14 wxb_nudt 阅读(3633) 评论(0)  编辑  收藏 所属分类: XML技术

(作者wxb_nudt,首发于中国XML论坛http://bbs.xml.org.cn/list.asp?boardid=28

关于XML Schema中的key和unique的概念很多Schema教程里面讲过,可惜网上大部分教程里面的例子是错误的,而且并没有给出完整清晰的解释,我查找了Schema的规范并写出了相应了例子,理清了这两个概念,希望对大家有所帮助。XML Schema规范来自于
http://www.w3.org/TR/xmlschema-0/

1.unique的定义和例子
规范中对于unique是这样定义的:XML Schema enables us to indicate that any attribute or element value must be unique within a certain scope. To indicate that one particular attribute or element value is unique, we use the unique element first to "select" a set of elements, and then to identify the attribute or element "field" relative to each selected element that has to be unique within the scope of the set of selected elements.
译文:XML Schema允许我们指出任意的属性或者元素值在某个范围内是唯一的。为了指出这个属性或者元素值的唯一性,我们使用了unique元素,它首先“选择”一组元素,然后指出这个属性或者元素的“域”在上一步所选择出的元素集合中是唯一的。
例子Schema:UniqueTest.xsd
<?xml version="1.0" encoding="GB2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xs:element name="Person">
  <xs:annotation>
   <xs:documentation>Comment describing your root element</xs:documentation>
  </xs:annotation>
  <xs:complexType>
   <xs:sequence>
    <xs:element name="Name" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="Id" type="xs:integer" maxOccurs="unbounded">
    </xs:element>
   </xs:sequence>
  </xs:complexType>
  <xs:unique name="IdUnique">
   <xs:selector xpath=".//Id"/>
   <xs:field xpath="."/>
  </xs:unique>
 </xs:element>
</xs:schema>

例子XML:UniqueTest.xml
<?xml version="1.0" encoding="GB2312"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="UniqueTest.xsd">
<Name>wxb_nudt</Name>
 <Id>1001</Id>
 <Id>1002</Id>
 <Id>1001</Id> <!--这儿就会报错,因为它的值和第一个Id重复了,并不是唯一的-->
 <Id>1004</Id>
</Person>

2.key的定义和例子
规范中是通过一个较长的例子来说明key和keyref的定义,归纳起来可以做如下定义:XML Schema可以通过将一个元素或者属性定义为一个key,这个key必须是unique的,这个key可以在XML文档中的其他部分通过keyref进行引用,keyref的值一定取自于key的某一个值。key的概念很类似于数据库中的外键。
key的具体定义方法很类似于unique的定义方法,首先“选择”一组元素,然后指出某个属性或者元素的“域”就是一个key。
而keyref与key的定义完全相似,唯一的区别是加了一个refer属性,这个refer属性指出了key的名字,具体例子如下:
例子schema:KeyExam.xsd
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by wxb (nudt) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xsd:element name="rootElement">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="elementOne" maxOccurs="unbounded">
     <xsd:complexType>
      <xsd:attribute name="elementOneKey" type="xsd:integer"/>
      <xsd:attribute name="elementOneDesc" type="xsd:string"/>
     </xsd:complexType>
    </xsd:element>
    <xsd:element name="elementTwo" maxOccurs="unbounded">
     <xsd:complexType>
      <xsd:attribute name="elementTwoKey" type="xsd:integer"/>
      <xsd:attribute name="elementOneKey" type="xsd:string"/>
      <xsd:attribute name="elementTwoDesc" type="xsd:string"/>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
  <xsd:key name="elementOnePK">
   <xsd:selector xpath=".//elementOne"/>
   <xsd:field xpath="@elementOneDesc"/>
  </xsd:key>
  <xsd:keyref name="elementOneFK" refer="elementOnePK">
   <xsd:selector xpath=".//elementTwo"/>
   <xsd:field xpath="@elementTwoDesc"/>
  </xsd:keyref>
  <xsd:unique name="EOneKeyU" xsi:type="xsd:integer">
   <xsd:selector xpath=".//elementOne"/>
   <xsd:field xpath="@elementOneKey"/>
  </xsd:unique>
 </xsd:element>
</xsd:schema>

例子xml:KeyExam.xml
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KeyExam.xsd">
 <elementOne elementOneKey="1" elementOneDesc="a"/>
 <elementOne elementOneKey="2" elementOneDesc="b"/>
 <elementOne elementOneKey="3" elementOneDesc="c"/>
 <elementOne elementOneKey="4" elementOneDesc="d"/>
 <elementTwo elementOneKey="5" elementTwoDesc="e" elementTwoKey="78"/>
 <!--上面的elementTwoDesc作为elementOneDesc的一个keyref,它必须取值于上面的4个key值之一,这里它的值"e"因为不是取值于"a","b","c","d",所以会报错-->
</rootElement>
 


只有注册用户登录后才能发表评论。


网站导航: