| 文章首页 |
|---|
| XML Namespace命名空间上手指南 |
| 什么是命名空间(Namespace) |
| XML为什么需要命名空间? |
| XML命名空间的语法规则 |
| 解析器是怎样处理XML命名空间的? |
| 命名空间和DTD |
| 命名空间和XML模式 |
页6 共7页
命名空间完全独立于DTD之外,而且可被用于正确合法或不正确合法的文件。文件可以有一份DTD但不使用命名空间,也可以只使用命名空间而不用DTD。命名空间不会以任何方式改变DTD语法,也不会改变正确合法性的定义。例如,一份使用某个名为dc:title元素的正确合法文件,它的DTD必须包含一个ELEMENT声明,来为dc:title元素安排适当的内容:<!ELEMENT dc:title (#PCDATA)>文件中该元素的名称必须配合DTD中声明的元素名称──准确地说是包含了前置字的名称。DTD不能忽略前置字而只声明了title元素。具前置字的属性也类似如此。例如,若文件内某元素用xlink:type和xlink:href属性,则DTD必须声明xlink:type和xlink:href属性,而不是type和href。
相反地,如果一个元素使用了xmlns属性,来设定预设命名空间,而不为该元素加上前置字,则在DTD中该元素的名称就必须以没有前置字的方式声明。正确合法性验证器既不知道也不关心命名空间,它所看到的只是某些元素和属性名称恰巧包含了冒号;而它所关心的是:这样的名称只要被声明,即为完全地正确合法。
命名空间前置字的参数实体参考
DTD必须声明包含前置字的名称,而不只是声明简单的名称,或者声明本地部份和命名空间URI的某种组合,这种要求使得要在正确合法的文件中改变前置字,变得很困难。问题在于,要改变前置字必须改变所有DTD中使用到前置字的声明。但是,由于当初设计者的高瞻远瞩,参数实体参考可以让你不需要为这麻烦感到头疼。首先,将命名空间里前置字和冒号的部份,独立定义成参数实体:
<!ENTITY % dc-prefix "dc">接下来,将全称名称也定义成参数实体参考:
<!ENTITY % dc-colon ":">
<!ENTITY % dc-title "%dc-prefix;%dc-colon;title"><!ENTITY % dc-creator "%dc-prefix;%dc-colon;creator"><!ENTITY % dc-description "%dc-prefix;%dc-colon;description"><!ENTITY % dc-date "%dc-prefix;%dc-colon;date">
定义全称名称
不要忽略这一步,也不要试着在ELEMENT和ATTLIST声明里,直接使用dc-prefix和dc-colon参数实体。这种方法会失败,因为对于一个实体而言,除了在另一个实体的替代文字中被用到之外,其它情况的使用,XML解析器都会在它的替代文字旁加上额外空白。
接着,在所有声明中,使用实体参考来代替全称名称:
<!ELEMENT % dc-title;(#PCDATA)>现在,一份文件就可以透过对参数实体之定义的变更,来改变前置字。在某些情况下,直接编辑DTD会改变定义;而在其它情形下,于文件的内部DTD子集中覆写原来的定义,也能达成变更。例如,要将前置字dc改成dublin,只须在DTD里,正常定义之前的某处,加上以下的实体定义:
<!ELEMENT % dc-creator;(#PCDATA)>
<!ELEMENT % dc-description; (#PCDATA)>
<!ELEMENT % dc-date; (#PCDATA)>
<!ELEMENT rdf:Description
((%dc-title; | %dc-creator; | %dc-description; | %dc-date; | )*)
>
<!ENTITY % dc-prefix "dublin">若你想用xmlns来代替前置字的使用,可以将dc-prefix和dc-colon实体重新定义成空字串:
<!ENTITY % dc-prefix "">
<!ENTITY % dc-colon "">
如果你喜欢这篇文章,请阅读本文相关的下列内容:
比本文新的文章:
