DTD实体之 参数实体

来源:互联网 发布:nginx 外网访问内网ip 编辑:程序博客网 时间:2024/04/30 18:38

http://blog.sina.com.cn/s/blog_5f1bfbd9010129d9.html


仅仅在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文档词汇表来说,实体是一种非常有价值的工具。


#Xml

0 0