|
3. 逻辑结构 3.1 起始标签,结束标签和空元素标签 3.2 元素类型声明 3.2.1 元素型内容 3.2.2 混合型内容 3.3 属性表声明 3.3.1 属性类型 3.3.2 属性的缺省值 3.3.3 属性-值对的规范化 3.4 条件段
[定义:每个 XML 文件包含一个或多个元素,它们的边界用起始标签和结束标签分隔,或者,对于空元素,用一个空元素标签分隔。每一个元素有一个用名字标识的类型,有时称之为它的"通用标识符(generic identifier)"(GI),同时它可以有一个属性值说明(attribute specification)集。] 每一个属性值说明有一个名字和一个值。
元素
[39]
element
::=
EmptyElemTag
| STag content ETag
[WFC: 元素类型匹配]
[VC: 元素有效性]
除了那些开头匹配(('X'|'x')('M'|'m')('L'|'l'))的名字保留用于本规范的此版本和后继版本的标准化外,本规范不对元素类型和属性的语义,用法和名字(语法之外)作出限制。
格式正确性约束: 元素类型匹配 元素结束标签中的 Name 必须和起始标签中的元素类型相匹配。
有效性约束: 元素有效性 如果有一个与 elementdecl 相匹配的声明的 Name 与元素类型相匹配,且下述之一成立时,称此元素是有效的:
- 此声明与 EMPTY 相匹配,同时此元素没有内容。
- 此声明与
children 相匹配,同时子元素的序列属于内容模型中的正则表达式所产生的语言,在起始标签和第一个子元素之间,子元素之间以及最后一个子元素和结束标签之间允许有空白(匹配非终结符 S 的字符)。注意,仅包括空白的 CDATA 段不匹配非终结符 S,因此不能在这些位置出现。
- 此声明与
Mixed 相匹配,同时内容由其类型匹配内容模型中的名字的字符数据和子元素组成。
- 此声明与 ANY 相匹配,同时每个子元素的类型均已声明。
3.1 起始标签,结束标签和空元素标签
[定义:每一个非空 XML 元素以一个起始标签作为开始的标记。]
起始标签
[40]
STag
::=
'<' Name (S Attribute)* S? '>'
[WFC: 唯一的属性值说明]
[41]
Attribute
::=
Name Eq AttValue
[VC: 属性值类型]
[WFC: 无外部实体引用]
[WFC: 在属性值中没有<]
起始标签和结束标签中的 Name 给出了元素的类型。[定义:Name-AttValue 对被统称为元素的属性值说明],[定义:其中每一对中的 Name 被称为属性名],[定义:AttValue 的内容(在'或"定界符间的文本)被称为属性值]。注意,在起始标签和空元素标签中各个属性值声明的次序没有意义。
格式正确性约束: 唯一的属性值说明 一个属性名只能在同一个起始标签或空元素标签中出现一次。
有效性约束: 属性值类型 属性必须被声明,其值必须具有所声明的类型。(属性类型参见"3.3 属性表声明"。)
格式正确性约束: 无外部实体引用 属性值不能包含对外部实体直接或间接的实体引用。
格式正确性约束: 在属性值中没有 < 在一个属性值中直接或间接引用的实体的置换文本不能包含 < 。
起始标签的一个例子:
[定义:由一个起始标签开始的每一个元素必须用一个结束标签标记其结束,结束标签中的名字必须与起始标签中给出的元素类型相同:]
结束标签
[42]
ETag
::=
'' Name S? '>'
结束标签的一个例子:
[定义:在起始标签和结束标签中的文本被称为元素的内容:]
元素的内容
[43]
content
::=
CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
/* */
[定义:称没有内容的元素其内容为空。] 空元素可以用一个起始标签紧跟一个结束标签的方式或空元素标签来表示。[定义:空元素标签有一种特殊的形式:]
空元素标签
[44]
EmptyElemTag
::=
'<' Name (S Attribute)* S? '/>'
[WFC: 唯一的属性值说明]
不论元素是否用关键字 EMPTY 声明,空元素标签都可以用于任何没有内容的元素。出于互操作性考虑,空元素应该用于,且只应用于声明为 EMPTY 的元素。
空元素的例子:
3.2 元素类型声明
出于验证的目的,可以用元素类型和属性表声明限制 XML 文件中元素的结构。元素类型声明限制了元素的内容。
元素类型声明通常限制了子元素的类型。由使用者选择,当声明提到的元素类型没有相应的声明时,XML 处理器可以给出警告,但这不是一个错误。
[定义:元素类型声明的形式如下:]
元素类型声明
[45]
elementdecl
::=
'Name S contentspec S? '>'
[VC: 唯一的元素类型声明]
[46]
contentspec
::=
'EMPTY' | 'ANY' | Mixed | children
其中 Name 给出了所声明的元素类型。
有效性约束: 唯一的元素类型声明 元素类型只能声明一次。
元素类型声明的例子:
3.2.1 元素型内容
[定义:当某一类型的元素只能包含用可选空白(匹配非终结符 S)分隔的子元素(无字符数据)时,称此元素类型具有元素型内容。] [定义:在这种情况下,有内容模型作为类型限制之一,内容模型是决定子元素类型和子元素出现顺序的一种简单文法。] 此文法用内容粒子( cp )构建,内容粒子由名字,内容粒子的选择表(choice list)或内容粒子的序列表(sequence list)组成:
元素型内容的模型
[47]
children
::=
(choice | seq) ('?' | '*' | '+')?
[48]
cp
::=
(Name | choice | seq) ('?' | '*' | '+')?
[49]
choice
::=
'(' S? cp ( S? '|' S? cp )+ S? ')'
/* */
/* */
[VC: 严格的组/参数实体嵌套]
[50]
seq
::=
'(' S? cp ( S? ',' S? cp )* S? ')'
/* */
[VC: 严格的组/参数实体嵌套]
其中每一个 Name 是可以作为子元素的元素的类型。选择表中出现的任意内容粒子在元素型内容中允许出现的位置对应于选择表在文法中的位置。序列表中出现的所有内容粒子必须以相同的顺序出现在元素型内容中。在名字或表之后的可选字符(optional character)决定了表中元素或内容粒子可以出现一次或多次(+),还是零次或多次(*),或是零次或一次(?)。没有这样一个操作符意味着元素或内容粒子必须恰好出现一次。这种语法和意义和本规范中的产生式中所使用的相同。
当且仅当一个元素的内容可以通过满足内容模型中的选择,序列和重复操作符得到,并且内容中的每一个元素与内容模型中的一种元素类型相匹配时,称此元素的内容与该内容模型相匹配。出于兼容性考虑, 如果文件的某个元素可以和内容模型中的一种元素类型多次匹配,这是一个错误。 更详细的信息参见"E. 确定型内容模型".
有效性约束: 严格的组/参数实体嵌套 参数实体的置换文本必须由括号括起的组严格嵌套。即,如果 choice,seq 或 Mixed 语法成分的开始或结束括号出现在某个参数实体的置换文本中,两者必须同在此置换文本中。
出于互操作性考虑,如果一个参数实体引用出现在choice,seq或Mixed语法成分中时,它的置换文本至少应该包含一个非空字符,同时其置换文本的第一个和最后一个非空字符都不应为一个连接符(| 或 ,)。
元素型内容的模型举例:
:]ode>
3.2.2 混合型内容(Mixed Content)
[定义:当某元素类型可以包含字符数据,其间可以随意穿插子元素时,称此元素类型具有混合型内容。] 在这种情况下,对子元素的类型可能有所限制,但对它们的次序和出现次数没有限制:
混合型内容声明
[51]
Mixed
::=
'(' S? '#PCDATA' (S? '|' [1] [2] [3] 下一页
|