前端之家收集整理的这篇文章主要介绍了
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,作为本地数据库与专用数据模式之间的转换工具,你会深刻体会到这几种类型的价值。