技术规范集萃网络应用类文档格式.docx
《技术规范集萃网络应用类文档格式.docx》由会员分享,可在线阅读,更多相关《技术规范集萃网络应用类文档格式.docx(110页珍藏版)》请在冰豆网上搜索。
否则它们出现错误。
错误(error)
对本规范中的规则的违反;
其结果不确定。
合乎规范的软件可以检测和报告错误,并可以从中恢复。
严重错误(fatalerror)
合乎规范的XML处理器必须检测到,并向应用报告的一类错误。
在遇到严重错误之后,处理器可以继续处理数据以发现更多的错误并可以向应用报告这些错误。
为了支持错误的更正,处理器可以向应用提供文件中未经处理的数据(字符数据和标记的混合体)。
但是,一旦检测到一个严重错误,处理器必须停止正常的处理(也就是说,它必须停止以正常的方式向应用提供与文件逻辑结构有关的数据和信息)。
由使用者选择(atuseroption)
合乎规范的软件可以或者必须(取决于句子中的情态动词)按所描述的方式工作;
如果它满足这个条件,它必须同时提供使用者一种手段,使得使用者能够启用和禁用所描述的工作方式。
有效性约束(validityconstraint)
适用于所有有效的XML文件的一种规则。
违反有效性约束属于错误;
进行验证的XML处理器必须,由使用者选择,报告这些错误。
格式正确性约束(well-formednessconstraint)
适用于所有格式正确的XML文件的一种规则。
违反格式正确性约束属于严重错误。
匹配(match)
(对于字符串和名字:
)被比较的两个字符串或名字必须完全相同。
在ISO/IEC10646中有多种可能表示方式的字符(例如,既有预定义(precomposed)形式和基字符(base)+变音符形式的字符)只在两个字符串中的表示方式相同时才匹配。
不进行字符的大小写转换。
(对于文法中的字符串和规则:
)如果一个字符串属于一个文法产生式产生的语言,则它匹配这个产生式。
(对于内容和内容模型:
)当一个元素符合"
元素有效性"
约束中的描述时,它匹配其声明。
)
出于兼容性考虑(forcompatibility)
指出此句描述的XML特性完全只是为了和SGML保持兼容。
出于互操作性考虑(forinteroperability)
指出此句是一个不具约束性的建议,目的是增加XML文件能被在ISO8879的WebSGML改编附件之前已有的SGML处理器处理的可能性。
2.文件
如果一个数据对象满足本规范中格式正确的之定义时,它是一个XML文件。
一个格式正确的XML文件可以更进一步是有效的,如果它满足某些进一步的约束的话。
]
每一个XML文件都有逻辑和物理结构。
物理上而言,文件由称为实体的单元组成。
一个实体可以引用(refer)其他实体,将它们包含在文件中。
文件开始于"
根(root)"
或文件实体。
逻辑上而言,文件由声明,元素,注释,字符引用和处理指令组成,所有这些都在文件中用显式标记指明。
逻辑和物理结构必须如"
4.3.2格式正确的已析实体"
中所描述的那样严格地嵌套。
2.1格式正确的XML文件(Well-FormedXMLDocuments)
一个文本对象是一个格式正确的XML文件如果它满足:
1)作为一个整体,它匹配document产生式。
2)它满足本规范中定义的所有格式正确性约束。
3)此文件中直接或间接引用的每一个已析实体都是格式正确的。
文件
[1]document:
:
=prologelementMisc*
匹配document产生式意味着:
1)它包含一个或多个元素。
2)[定义:
有且仅有一个称为根(root)或文件元素的元素,它不出现在其他任何元素的内容(content)中。
]对于其他所有元素,如果起始标签在另一个元素的内容中,则其结束标签也在同一元素的内容中。
换一个更简单的说法,以起始标签和结束标签为界的各个元素,必须严格地嵌套。
这样做的结果是,对于每一个非根的元素C,文件中另有一个元素P,C在P的内容中,而不在其他任何被P所包含的元素的内容中。
P被称为C的父元素(parent),而C被称为P的子元素(child)。
2.2字符
一个已析实体包含文本(text),文本是一个字符(character)序列,可以表示标记或字符数据。
一个字符是ISO/IEC10646[ISO/IEC10646](或[ISO/IEC10646-2000])中定义的文本最小单元。
合法的字符包括制表符,回车,换行以及Unicode和ISO/IEC10646中定义的合法字符。
在制定本文档时,在附录A.1正式参考文献中引用的标准都是当时的最新版本,在这些标准的增补版或新版中可能会加入新的字符。
因此,XML处理器必须能接受产生式Char中所定义范围内的任意字符。
不提倡使用[Unicode]6.8节(或[Unicode3]3.6节D21)中定义的"
兼容字符(compatibilitycharacters)"
。
字符范围
[2]Char:
=#x9|#xA|#xD|[#x20-#xD7FF]|[#xE000-#xFFFD]|[#x10000-#x10FFFF]
/*除了代用块(surrogateblock),FFFE和FFFF以外的任意Unicode字符。
*/
将字符代码编码成位模式的机制各个实体间可能会有所不同。
所有的XML处理器必须接受10646中的UTF-8和UTF-16编码;
用于指出所用编码或指定使用其他编码的机制在后面的"
4.3.3实体中的字符编码"
中讨论。
2.3通用语法成分
本节中定义了一些在文法中广泛使用的符号。
S(空白)包括一个或多个空格字符(#x20),回车,换行和制表符。
空白
[3]S:
=(#x20|#x9|#xD|#xA)+
为方便起见,字符被分为字母,数字和其他字符三类。
字母可以是字母表中的字母,或是一个音节基字符(syllabicbasecharacter),也可以是一个表意字符。
在"
B.字符的分类"
中给出了每一类字符的完整定义。
名字(name)是以字母或某些标点符号开头的记号,后跟字母,数字,连字符,下划线,冒号或句号,这些符号统称为命名字符(namecharacter)。
]以"
xml"
或其他任何匹配(('
X'
|'
x'
)('
M'
m'
L'
l'
))的字符串开头的名字,被保留用于本规范的此版本或后续版本的标准化。
注:
XML建议中的名域[XMLNames]赋予了包含冒号的名字某种含义。
因此除非用于名域,XML文件作者不应该在XML名字中使用冒号,但XML处理器应该接受冒号作为一个命名字符。
Nmtoken(名字记号,nametoken)是任何命名字符的混合体。
名字和记号
[4]NameChar:
=Letter|Digit|'
.'
|'
-'
_'
'
|CombiningChar|Extender
[5]Name:
=(Letter|'
)(NameChar)*
[6]Names:
=Name(SName)*
[7]Nmtoken:
=(NameChar)+
[8]Nmtokens:
=Nmtoken(SNmtoken)*
常量数据是任何用引号括起的字符串,不包括用作定界符的引号。
常量用于指明内部实体的内容(EntityValue),属性值(AttValue),以及外部标识符(SystemLiteral)。
注意,对SystemLiteral的语法分析可以不扫描标记。
常量
[9]EntityValue:
='
"
([^%&
]|PEReference|Reference)*'
|"
]|PEReference|Reference)*"
[10]AttValue:
([^<
&
]|Reference)*'
]|Reference)*"
[11]SystemLiteral:
=('
[^"
]*'
)|("
[^'
]*"
[12]PubidLiteral:
PubidChar*'
(PubidChar-"
)*"
[13]PubidChar:
=#x20|#xD|#xA|[a-zA-Z0-9]|[-'
()+,./:
=?
;
!
*#@$_%]
虽然产生式EntityValue允许定义只包含单个<
的实体(如,<
ENTITYmylt"
<
>
),但是强烈建议避免这种用法,因为对此实体的任何引用都会引起一个格式正确性错误。
2.4字符数据和标记
文本由字符数据和标记混合构成。
标记包括起始标签,结束标签,空元素标签,实体引用,字符引用,注释,CDATA段定界符,文件类型声明,处理指令,XML声明,文本声明,以及任何在文件实体顶层的空白(即,在文件元素之外且不在任何其他的标记中)。
其他所有非标记的文本组成文件的字符数据。
and"
号(&
)和左尖括号(<
)只有作为标记定界符,或在注释,处理指令,或CDATA段中时才能以常量形式出现。
如果在其他地方需要用到这两个字符,它们必须用数值式字符引用来转义或分别用字符串"
amp;
和"
lt;
表示。
右尖括号(>
)可以用"
gt;
表示,而当它在内容中的字符串"
]]>
中出现,但此字符串不表示一个CDATA段的结束时,出于兼容性考虑,必须用"
或一个字符引用转义得到。
在一个元素的内容中,字符数据可以是不包括任何标记的起始定界符的任意字符串。
在一个CDATA段中,字符数据可以是不包括CDATA段结束定界符"
的任意字符串。
为了允许在属性值中包含单引号和双引号,省略符或称单引号('
)可以被表示为"
apos;
,而双引号("
quot;
字符数据
[14]CharData:
=[^<
]*-([^<
[^<
]*)
2.5注释
注释可以在其他标记之外的文件中的任何位置出现。
另外,它们可以在文件类型声明中文法允许的地方出现。
它们不是文件字符数据的一部分,XML处理器可以,但不是必须,允许一个应用检索注释的文本。
出于兼容性考虑,字符串"
--"
(双连字符)不能在注释中出现。
]注释中的参数实体不被识别。
注释
[15]Comment:
--'
((Char-'
)|('
(Char-'
)))*'
-->
注释的一个例子:
--declarationsfor<
head>
&
<
body>
-->
注意,此文法不允许注释以--->
结尾。
下面的例子不是格式正确的。
--B+,B,orB--->
2.6处理指令
处理指令(PI)允许文件中包含由应用来处理的指令。
处理指令
[16]PI:
?
PITarget(S(Char*-(Char*'
Char*)))?
'
[17]PITarget:
=Name-(('
))
PI不是文件字符数据的一部分,但必须传递给应用。
PI以用于指示传递给哪个应用的目标(PITarget)开头。
目标名字"
XML"
,"
,等等,保留用于本规范的此版本或后续版本的标准化。
XML记法机制可以用于PI目标的形式化声明。
参数实体在处理指令中不被识别。
2.7CDATA段
CDATA段可以出现在字符数据可以出现的任何地方,它们用于转义包含会被识别为标记的字符串的文本块。
CDATA段以字符串"
[CDATA["
开始,以字符串"
结束:
CDATA段
[18]CDSect:
=CDStartCDataCDEnd
[19]CDStart:
[CDATA['
[20]CData:
=(Char*-(Char*'
))>
Char*))
[21]CDEnd:
在一个CDATA段内,只有CDEnd字符串被识别为标记,因此左尖括号和"
可以以它们的常量形式出现,不需要(也不能)被换码为"
CDATA段不能嵌套。
一个CDATA段的例子,其中"
greeting>
/greeting>
被识别为字符数据,而不是标记:
[CDATA[<
Hello,world!
2.8序言(prolog)和文件类型声明
XML文件应该以一个XML声明开始,其中指明了所用XML的版本。
]例如,以下是一个完整的XML文件,它是格式正确的,但不是有效的:
xmlversion="
1.0"
下面这个也同样:
版本号"
应该用于表明与本规范的本版本相一致,如果使用了值"
但又与本规范的本版本不一致,那么这是文件的一个错误。
XML工作组打算赋予本规范的后续版本不同于"
的数值,但这并不代表开发后续版本的承诺,也不代表如果有后续版本,会使用任何特殊的命名方案的承诺。
因为不排除有后续版本的可能性,提供了本构造(construct)作为一旦需要时进行自动版本识别的手段。
当处理器收到的文件标有它们不支持的版本时,可以给出一个错误。
XML文件中标记的功能是描述文件的存储格式和逻辑结构,并将属性-值对和逻辑结构关联起来。
XML提供一种称为文件类型声明的机制,用于定义对逻辑结构的约束,支持预定义存储单元的使用。
如果一个XML文件有相应的文件类型声明并且它遵循其中的约束,则称它是有效的(valid)。
文件类型声明必须位于文件第一个元素之前。
序言
[22]prolog:
=XMLDecl?
Misc*(doctypedeclMisc*)?
[23]XMLDecl:
xml'
VersionInfoEncodingDecl?
SDDecl?
S?
[24]VersionInfo:
=S'
version'
Eq("
VersionNum"
VersionNum'
)/**/
[25]Eq:
=S?
='
[26]VersionNum:
=([a-zA-Z0-9_.:
]|'
)+
[27]Misc:
=Comment|PI|S
XML文件类型声明包含或指向标记声明,标记声明提供某一类文件的文法。
这种文法被称为文件类型定义(documenttypedifinition,DTD)。
文件类型定义可以指向一个外部子集(一种特殊类型的外部实体),或者可以在一个内部子集中直接包含标记声明,或者两者兼用。
一个文件的文件类型定义由这两个子集合在一起组成。
标记声明可以是元素类型声明,属性表声明,实体声明,或是记法声明。
]这些声明可以如下面格式正确性和有效性约束中所述,全部或部分地包含在参数实体中,"
4.物理结构"
中有更多的信息。
文件类型定义
[28]doctypedecl:
DOCTYPE'
SName(SExternalID)?
('
['
(markupdecl|DeclSep)*'
]'
)?
/*[VC:
根元素类型][WFC:
外部子集]*/
[28a]DeclSep:
=PEReference|S
/*[WFC:
声明间的参数实体]*/
[29]markupdecl:
=elementdecl|AttlistDecl|EntityDecl|NotationDecl|PI|Comment
/*[VC:
严格的声明/参数实体嵌套][WFC:
内部子集中的参数实体]*/
注意,要构建包含了一个既不指向外部子集也不包含内部子集的doctypedecl而格式正确的文件是可能的。
标记声明可以全部或部分地由参数实体的置换文本组成。
本规范后面的各个非终结符(elementdecl,AttlistDecl,等等)产生式描述的是在所有的参数实体被包含(include)之后的声明。
除了在常量,处理指令,注释和被忽略的条件段的内容中出现的参数实体引用以外,DTD中的其他任何地方(内部或外部子集以及外部参数实体)的参数实体引用都被识别(见3.4条件段)。
在实体值常量中的参数实体引用也被识别。
内部子集中参数实体引用的使用限制如下所述。
有效性约束:
根元素类型(RootElementType)
文件类型声明中的Name必须匹配根元素的类型。
严格的声明/参数实体嵌套
参数实体的置换文本必须用标记声明严格嵌套。
即,如果一个标记声明(上面的markupdecl)的第一个或最后一个字符被包含于一个参数实体引用的置换文本中,两者必须都在此置换文本中。
格式正确性约束:
内部子集中的参数实体
在内部DTD子集中,参数实体引用只能出现在标记声明可以出现的地方,而不能在标记声明内部出现。
(这个约束不适用于出现在外部参数实体内的引用,也不适用于外部子集。
)
外部子集
外部子集(如果有的话)必须匹配产生式extSubset。
声明间的参数实体
一个DeclSep内的参数实体引用的置换文本必须匹配产生式extSubsetDecl。
同内部子集一样,外部子集和任何DeclSep中引用的外部参数实体,必须由一系列被非终结符markupdecl所允许的完整的标记声明组成,其中可以夹杂空白字符或参数实体引用。
但是,外部子集和外部参数实体的部分内容可以通过使用条件段(conditionalsection)被有条件地忽略,在内部子集中则不允许这么做。
外部子集
[30]extSubset:
=TextDecl?
extSubsetDecl
[31]extSubsetDecl:
=(markupdecl|conditionalSect|DeclSep)*/**/
外部子集和外部参数实体与内部实体不同之处还在于:
在它们内,参数实体引用不仅可以出现在标记声明间,还可以出现在标记声明内。
有文件类型声明的XML文件的例子:
DOCTYPEgreetingSYSTEM"
hello.dtd"
系统标识符"
给出了此文件的DTD的地址(一个URI引用)。
声明也可以如同下面这个例子一样直接(locally)给出:
encoding="
UTF-8"
?
DOCTYPEgreeting[
ELEMENTgreeting(#PCDATA)>
]>
如果同时使用外部和内部子集,子集子集被看成出现在外部子集之前,这意味着内部子集中的实体和属性表声明的优先级要比在外部子集中的高。
2.9独立文件声明
当文件从XML处理器递给应用时,标记声明可以影响它的内容,属性缺省值和实体声明是其中的例子。
可以作为XML声明一个成分的独立文件声明,指明了是否存在着在文件实体外或在参数实体中的声明。
外部标记声明被定义为出现在外部子集或参数实体(外部或内部,包括内部