XML定义属性ID、IDREF、IDREFS详解(2012

属性类型:ID  含义:特定文档中唯一的名称


   属性类型:IDREF   含义:对某些具有ID属性的元素的引用,这些元素的ID属性值必须与IDREF属性的值相同


   属性类型:IDREFS   含义:若干以空格分隔的IDREF


   属性类型:ENTITY   含义:已定义的外部实体的名称


   属性类型:ENTITIES   含义:若干以空格分隔的ENTITY名称


   属性类型:NMTOKEN   含义:名称


   属性类型:NMTOKENS   含义:若干以空格分隔的NMTOKEN


   属性类型:NOTATION   含义:接受一个在DTD中声明为用于指示表示法类型的名称


   属性类型:枚举值   含义:接受用户显式定义的属性可选值中的一个值


   毫无疑问,对于ID类型的属性,其值必然是具有唯一标识功能的名称。而且它们必须遵守XML名称定义的规则。特定元素的ID属性值在整个文档中必须是唯一的。它可以作为元素的唯一标识符。每个元素至多有一个ID类型的属性。

 

   最后需要说明的是,ID类型的属性必须设置为#IMPLIED或#REQUIED,不能是#FIXED或缺省的。可想而知,为ID提供缺省值,特别是固定的缺省值是毫无意义的。这会破坏ID的唯一性。例如,在下面的声明中,社会保障号(SSN)作为个人的唯一标识符,并与文件中的个人信息相关联:


   <!ATTLIST Person SSN ID #REQUIED>


   如何使ID类型的属性发挥作用呢?当然是通过引用。我们可以利用它在两个对象之间建立一对一的关系。IDREF类型可以用于在文档中创建链接和交叉引用。IDREF属性的值必须受到与ID类型同样的约束。它们必须与文档中的某个ID属性具有相同的值。IDREF值不能指向文档中不存在的ID。在应用程序中,我们通过ID和IDREF实现交叉引用,而不必多次重复整个元素。如果文档中包含上述声明,可以在DTD中写入以下声明:


   <!ELEMENT Customer EMPTY>
   <!ATTLIST Customer id IDREF #REQUIED>


   我们很容易想到,id属性是指Person中的SSN属性。则文档中可以写入以下代码:


   <Person SSN="111-22-333">
      <name> ... </name>
   </Person>
      ...
   <Customer id="111-22-333">


   通过交叉引用,customer可以写作具有IDREF属性的空元素,而不必包含整个Person元素。当我们需要Person信息时,由于Person元素的SSN属性与customcr的id属性具有相同的值,因此应用程序能够通过id找到Person元素。


   有时,我们希望将一个元素与其他多个元素相关联。这就要依靠IDREFS类型。它能够建立一对多的关系。这类属性的值是一系列以空格分隔的ID值。其中每个ID必须满足对ID类型的约束,当然它们必须与文档中的ID属性值相匹配。


   <!ELEMENT Team EMPTY>
   <!ATTLIST Team members IDREFS #REQUIED>

   以上代码段声明了一个空元素,它定义了项目组与戚员之间的一对多包古关系。Members属性通过引用Person元紊列举出项目组成员的标识,Person元素是在DTD的其他位置声明的,它具有ID类型的属性。例如:


   <Team members="111-22-333 222-11-444 123-45-6789">


   以上代码表示的项目组由三个人构成,他们的社会保障号分别是:111-22-333、222-11-444和123-45-6789。


  利用ID、IDREF和IDREFS,我们可以表示关系数据库中常见的关系。如果你将XML,作为本地数据库与专用数据模式之间的转换工具,你会深刻体会到这几种类型的价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值