XML规范 - 中文版(5)

2019-04-22 08:30

在 一个没有任何DTD的文件,或一个只有不包含参数实体引用的内部DTD子集的文件,或一个\的文件内,在实体引用中给 出的Name必须与实体声明中所给出的相匹配,但规范的文件不需要声明以下的这些实体:amp,lt,gt,apos和quot。参数实体的声明必须先于 任何对它的引用。类似地,普通实体的声明必须先于任何在属性表声明中的缺省值中出现的对它的引用。注意对于在外部子集或外部参数实体中声明的实体,不进行 验证的处理器不必要读取和处理它们的声明;对这些文件,仅当standalone='yes'时,实体必须被声明的规则才是一个规范性约束。

有效性约束:声明实体

在 一个有外部子集或外部参数实体且\的实体中,实体引用中给出的Name必须与实体声明中所给出的相匹配。出于互操作性考 虑,有效的文件应该以\预定义实体\中的简化形式声明实体amp,lt,gt,apos和quot。参数实体的声明必须先于任何对它的引用。类似 地,普通实体的声明必须先于任何在属性表声明中的缺省值中出现的对它的引用。

规范性约束:已析实体

实体引用不能包含一个未析实体的名字。未析实体只能在声明为ENTITY或ENTITIES的属性值中引用。 规范性约束:无递归

已析实体不能直接或间接地包含对自身的递归引用。 规范性约束:在DTD内

参数实体引用只能在DTD中出现。 字符引用和实体引用的例子:

Type less-than (<) to save options. This document was prepared on &docdate; and is classified &security-level;. 参数实体引用的例子:

%ISOLat2;

4.2 实体声明(Entity Declaration) 实体以如下方式声明: 实体声明

[70] EntityDecl ::= GEDecl | PEDecl

[71] GEDecl ::= '' [72] PEDecl ::= '' [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID

实体引用中的Name标识了该实体;对于未析实体,ENTITY或ENTITIES属性的值标识了该实体。如果同一实体被声明了不止一次,绑定第一个遇到的声明。由用户选择,如果实体被多次声明,XML处理器可以给出警告。

4.2.1 内部实体(Internal Entities)

如果实体定义是一个EntityValue,被定义的实体被称为内部实体。内部实体没有单独的物理存储对象,实体的内容在声明中给出。注意常量实体值中一些实体和字符引用的处理可能要求产生正确的置换文本:参见\内部置换文本的构造\。

内部实体是已析实体。 内部实体声明的例子:

4.2.2 外部实体(External Entities)

如果实体不是内部的,那么它是一个外部实体,声明如下: 外部实体声明

[75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral

[76] NDataDecl ::= S 'NDATA' S Name [ VC:声明记法 ]

如果有NDataDecl,那么这是一个普通未析实体;否则它是一个已析实体。 有效性约束:声明记法

Name必须与记法的名字相匹配。

SystemLiteral 被称为该实体的系统标识符。这是一个URI,可以用于存取此实体。注意井号(#)和URI中常用的片断标识符形式上而言不是URI的一部分;如果一个片断 标识符作为系统标识符的部分给出,XML处理器可以给出一个错误。除非在本规范范围之外另外给出(如,一个特殊DTD中定义的专用XML元素类型,或一个 特殊应用规范中定义的处理指令),相对URI指相对于实体声明所在资源的位置。因此,一个URI可能是相对于文件实体,或相对于包含外部DTD子集的实 体,或相对于其他一些外部参数实体。

XML处理器处理URI中的非ASCII字符时,应该将UTF-8中的字符用一个或多个字节表示,然后将这些字符用URI转义机制转义(即,将每个字节转换成%HH,其中HH是字节值的十六进制记法)。

除 了系统标识符之外,外部标识符还可以包含公共标识符。试图存取实体内容的XML处理器可以用公共标识符试着产生一个可选URI。如果处理器无法做到这一 点,它必须使用系统常量中的URI。在试着匹配之前,公共标识符中所有空白字符串必须被规范为单个空格字符(#x20),同时必须去掉前导和尾随空白。

外部实体声明的例子:

SYSTEM \://www.textuality.com/boilerplate/OpenHatch.xml\

PUBLIC \ \://www.textuality.com/boilerplate/OpenHatch.xml\

SYSTEM \ NDATA gif >

4.3 已析实体(Parsed Entities) 4.3.1 文本声明(Text Declaration)

每个外部已析实体可以以文本声明作为开始。 文本声明

[77] TextDecl ::= ''

文本声明必须以常量形式给出,而不能使用已析实体的引用。文本声明只能在外部已析实体的开头出现,不允许在其他任何地方出现。

4.3.2 规范的已析实体(Well-Formed Parsed Entities)

如果文件实体匹配document产生式,那么它是规范的。如果外部普通已析实体匹配extParsedEnt产生式,那么它是规范的。如果外部参数实体匹配extPE产生式,那么它是规范的。

规范的外部已析实体

[78] extParsedEnt ::= TextDecl? content [79] extPE ::= TextDecl? extSubsetDecl

如果内部普通已析实体的置换文本匹配content产生式,那么它是规范的。根据定义,所有内部的参数实体都是规范的。

实体符合规范性的一个结果是XML文件的逻辑和物理结构是严格嵌套的;起始标签,结束标签,空元素标签,元素,注释,处理指令,字符引用,或实体引用都不能在一个实体中开始而在另一个实体中结束。

4.3.3 实体中的字符编码(Character Encoding in Entities)

XML文件中的每个外部已析实体都可以对其字符采用一种不同的编码方案。所有XML处理器必须能读编码为UTF-8或UTF-16的实体。

以 UTF-16编码的实体必须以ISO/IEC 10646增补E和Unicode附录B(零宽度不间断空格字符,#xFEFF)中所描述的字节次序标记 (Byte Order Mark)开头。这是一个编码签名,即不是XML文件中标记的一部分,也不是XML文件字符数据的一部分。XML处理器必须能用 此字符区分UTF-8编码和UTF-16编码的文件。

虽然XML处理器只被要求能读取UTF-8和UTF-16编码的实体,已有共识认为世界上还有其他的编码方案。有时可能想让XML处理器读取以那些编码方案编码的实体。以不同与UTF-8和UTF-16的编码方案存储的实体必须以包含编码声明的文本声明开头:

编码声明

[80] EncodingDecl ::= S 'encoding' Eq ('\

[81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* /* 编码方案的名字只包含拉丁字母 */ 在文件实体中,编码声明是XML声明的一部分。EncName是所用编码方案的名字。

在 一个编码声明中,值\,\,\和\应该用于表示 Unicode或ISO/IEC 10646中的各种不同编码和变换方案,值\,\,... \应该用于表示ISO 8859的各个部分,而值\,\和\应该用于表示 JIS X-0208-1997的各种编码。XML处

理器可以识别其他编码方案;建议对于在 Internet Assigned Numbers Authority [IANA]注册的字符编码方案(以字符集(charset)的方式),除了 以上所列的之外,引用时应使用其注册名。注意这些注册名定义为大小写敏感,因此欲与之匹配的处理器要以大小写敏感的方式进行匹配。

在缺少外部传输协议(如HTTP或MIME)所提供的信息时,以下情况均是错误:XML处理器接收到的实体的编码方案与实体所含编码声明中指出的编码方案不 同,编码声明不在外部实体的开头,既不以字节次序标记开头也不以编码声明开头的实体使用了不同于UTF-8的编码。注意因为ASCII是UTF-8的一个子集,严格说来普通ASCII字符不需要编码声明。

当XML处理遇到的实体使用了它不能处理的编码时,是一个严重错误。 编码声明的例子:

4.4 XML处理器对实体和引用的处理

下表汇总了字符引用,实体引用,和对未析实体的调用可以出现的上下文,以及每种情况下XML处理器的动作。最左边一列的标签指明了识别时的上下文:

内容中的引用:可以在元素的起始标签之后,结束标签之前的任何地方以引用形式出现,对应于非终结符content。

属性值中的引用:可以在起始标签内的属性值中,或属性声明内的缺省值中以引用形式出现;对应于非终结符AttValue。

作为属性值:可以以Name而不是以引用的形式出现,作为声明为ENTITY类型的属性的值,或可以作为声明为ENTITIES类型的属性值中的以空白分隔的记号之一。

实体值中的引用:可以在参数中或内部实体的实体声明内的常量实体值中以引用形式出现;对应于非终结符EntityValue。

DTD中的引用:可以在DTD的内部或外部子集中以引用形式出现,但须在EntityValue和AttValue之外。

Entity Type

Parameter参数

Reference in Content 内容中的引用 Reference

in Attribute Value 属性值中的引用 Occurs as Attribute Value

作为属性值

Internal General 内部普通

External Parsed

General 外部已析普通

Unparsed 未析

Character 字符

Not recognized Included Included if validating Forbidden Included

Not recognized Included in literal Forbidden Forbidden Included

Not recognized Forbidden Bypassed

Forbidden Bypassed

Notify Forbidden

Not recognized Included

Reference Included in literal

in EntityValue 实体值中的引用 Reference in DTD DTD中的引用

Included as PE Forbidden Forbidden Forbidden Forbidden

4.4.1 不被识别(Not Recognized)

在DTD之外,百分号字符%没有特殊含义;因此在DTD中的参数实体引用在content中不被当成标记识别。类似地,除非未析实体的名字出现在已适当声明的属性的值中,否则它们不被识别。

4.4.2 被包含(Included)

当 一个实体的置换文本被当成出现在引用所在位置的文件的一部分一样被存取和处理时,称此实体被包含。其置换文本可以包含字符数据和标记(不包括参数实体), 其中标记必须以通常的方式识别,但用于转义标记定界符(实体amp,lt,gt,apos和quot)的实体的置换文本总是被当成数据。(字符 串\展开为\T&T;\尚存的\号&不被识别为实体引用的定界符。)当被表示的字符被当成出现在引用所在 位置一样被处理时,称此字符引用被包含。

4.4.3 进行验证时被包含(Included If Validating)

当 XML处理器识别出一个对已析实体的引用,为了验证该文件,处理器必须包含此实体的置换文本。如果实体是外部的,而处理器不试图验证该XML文件,那么处 理器可以,但不是必须,包含此实体的置换文本。如果一个不验证的语法分析器不包含此置换文本,它必须通知应用它识别出但没有读取此实体。

这条规范基于这样一个共识:由SGML和XML的实体机制提供的起初设计用于支持模块化创作的自动包含不一定适合于其他应用,尤其是文件浏览。例如,当浏览器遇到一个外部已析实体引用时,可能选择用可视方式表示其存在但只在被请求时才读取它进行显示。

4.4.4 被禁止(Forbidden)

以下情况被禁止,并构成一个严重错误: 出现对未析实体的引用。

在DTD中出现任何字符或普通实体引用,除非它们出现在EntityValue或AttValue中。 属性值中出现对外部实体的引用。 4.4.5 被包含在常量中(Included in Literal)

当实体引用出现在属性值中或参数实体引用出现在常量实体值中时,它们的置换文本被当成出现在引用所在位置的文件的一部分一样被存取和处理,置换文本中的单双引号总是被当成正常的数据字符而不会结束此常量。例如,下面的例子是规范的:

4.4.6 通知(Notify)


XML规范 - 中文版(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:威斯敏斯特小要理问答

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: