仅仅在DTD中使用的解析实体称为参数实体。它使我们能够简便地引用或修改DTD中常用的结构,我们只需维护一处代码。与逐一修改DTD中出现每个结构相比,这种方法简单得多,但是当我们打算扩展结构时,仍然需要编辑DTD。参数实体声明由以下几部分组成:ENTITY关键字、百分号、名称和替换值。例如:
<!ENTITY % peopleParameters "age CDATA #IMPLIED weight CDATA #IMPLIED height CDATA #REQUIRED">
上面的置换文本是属性列表声明的一部分,它包含三个普通属性。当解析器处理上述语句时,它会用这三个属性取代参数实体名称。如果我们需要在DTD输入该属性集合,只需引用实体perpleParameters即可。
在DTD中,所有参数实体必须在引用之前进行声明。这意味着DTD内部子集不能引用在外部子集中声明的参数实体,因为解析器首先读取内部子集----所以导致引用出现在声明之前。
引用参数实体时,需要在实体名称之前增加百分号,在其后增加分号。定界符与名称之间没有空格。下面的代码显示了如何引用上面定义的参数实体:
<!ATTLIST InsuredPerson %peopleParameters; carrier CDATA #REQUIRED >
上面代码声明InsurePerson元素包含4个属性:其中carrier是显式声明的,其余三个参数(age、weight和height)包含在参数实体中,当解析器用置换文本取代实体引用时,会出现元素的完整列表。因此,上面的例子等价于下面的代码:
<!ATTLIST InsuredPerson
age CDATA #IMPLIED
weight CDATA #IMPLIED
height CDATA #REQUIRED
carrier CDATA #REQUIRED>
这种类型的替换形式----在声明中进行替换----只能用于DTD外部子集。在内部子集中,参数实体引用只能位于其他声明之间:因此这类实体引用的置换文本必须是一个完整的声明,否则将影响DTD格式的正规性。
一个格式正规的文档应该遵循的规则都可以应用于参数实体。用置换文本取代实体饮用后,仍然必须保证文档格式的正规性。当您构建参数实体时。一定要谨记这条规则。通常,在参数实体的置换文本中使用标记时要格外谨慎。下面的例子就破坏了各式正规约束:
<!ENTITY %myParm "<!ENTITY genEnt 'some replacement text here' "> %myParm;
%myParm;的置换文本是不完整的声明,它缺少结束标记>,因此当解析器替换%myParm;时,DTD就不再是格式正规的了。
与通用实体类似,参数实体的置换文本也可以位于外部文件中。例如:
<!ENTITY %myParm SYSTEM "HTTP://WWW.GOOTRY.COM" >
从以上可以看出,对于定义XML文档词汇表来说,实体是一种非常有价值的工具。