3.1.3.9 实体属性类型与参数实体
   

在上一章中,我们介绍过实体的概念。相信你还能回忆起来,实体在XML中充当着宏或别名的角色。

实体最根本的作用是帮助你为一大段文本创建一个别名,这样,在文件的另一个位置需要引用这段文本时,仅需要指向它的别名就可以了。可想而知,这样一来,用于重新输入这段文本的大量时间就被节约下来了。它还意味着一旦需要修改,仅需要在一个地方作改动,就完成了全局的改动。

我们还提到,实体分为一般实体和参数实体两种类型,它们都可以定义为内部的也可以用关键字SYSTEM定义为外部的。实体的定义必须出现在引用之前,而且要注意正确嵌套,不能出现循环引用的情况。在DTD中,这两种类型的实体都得到了广泛的应用。

  • 实体属性类型

实体类型的属性值属于一般实体,如前所述,它的定义方式是:

<!ENTITY 实体名 "实体内容">

或利用SYSTEM定义外部实体,方式为:

<!ENTITY 实体名 SYSTEM "外部文件名">

引用方式为:

&实体名;

使用关键字ENTITY,则声明一个属性是实体类型,它的取值为已定义的实体。请看下面例子:

<?xml version = "1.0"
      encoding="GB2312"
      standalone = "yes"?>
<!DOCTYPE 文件[
    <!ELEMENT 文件 ANY>
    <!ELEMENT 电影 EMPTY>
    <!ATTLIST 电影 来源 ENTITY #REQUIRED>
    <!ENTITY BladeRunner SYSTEM "dvds/BR/br.mov">
    ]>

<文件>
    <电影 来源 = "&BladeRunner;">
</文件>
  • 参数实体

参数实体专门用在DTD中。定义方式是:

<!ENTITY % 实体名 "实体内容">

或:

<!ENTITY % 实体名 SYSTEM "外部文件名">

引用方式为:

%实体名;

使用参数实体,可以方便元素和属性的声明。例如:

<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人联系信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户联系信息 (%TAG_NAMES; | 公司名)>

最后提醒大家注意,不要以为实体属性类型的定义与DTD有关,所以它使用的就是参数实体。参数实体只能在DTD中使用,而对于任何元素属性值的指定(除了缺省值外),都是在XML文件正文中进行的,因此实体属性值仍属于一般实体。