荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: playboy (沉睡太平洋底), 信区: Program
标  题: 可扩展标记语言(XML) 1.0(4)
发信站: BBS 荔园晨风站 (Wed May 31 21:54:08 2000), 转信

2.9 独立文档声明
当文档从XML处理器递给应用时,标记声明可以影响它的内容,属性缺省
值和实体声明是其中的例子。可以作为XML声明成分的独立文档声明,
指明了对于文档实体而言,是否存在外部的声明。

独立文档声明
[32]  SDDecl ::=  S 'standalone' Eq (("'" ('yes' | 'no') "'") |
('"' ('yes' | 'no') '"'))  [  VC: 独立文档声明 ]


在一个独立文档声明中,值"yes"表示对于文档实体没有外部标记声明(不
论是在DTD外部子集中,还是在由内部实体引用的外部参数实体中)会影响
从XML处理器传递给应用的信息。值"no"表示有或可能有这样的外部标记
声明。注意独立文档声明只是表示外部声明的存在,如果文档中存在对外
部实体的引用,而这些实体已在内部声明时,不影响它的独立状态。

如果不存在外部标记声明,独立文档声明没有意义。如果存在外部标记声
明,但没有独立文档声明,就假定取值"no"。

某些网络传输应用也许需要独立的文档,任何满足standalone="no"的XML
文档可以通过一定的算法转换为独立文档。

有效性约束: 独立文档声明
独立文档声明必须取值为"no",如果任何外部标记声明中包含:

n       有缺省值的属性声明,如果适用这些属性的元素出现在文档中
而又没有给这些属性赋值的话。
n       (除了amp,lt,gt,apos,quot的)实体声明,而对这些实体
的引用出现在文档中的话。
n       需要规范化的属性声明,这些出现在文档中的属性的值会因规
范化而改变。
n       具有元素内容的元素类型声明,如果在这些类型的任一实例中
直接出现空白域的话。

具有独立文档声明的XML声明的例子:

<?xml version="1.0" standalone='yes'?>

2.10 空白域处理
在编辑XML文档时,使用"空白域"(空格,制表符,空行,在本规范中用非
终结符S表示)来分开标记以获得更好的可读性是很方便的。通常在文档的
交付版本中不想包含这些空白域。另一方面,必须保留在交付版本中的有
意义的空白域是很常见的,如在诗歌和源码中的空白域。

XML处理器必须始终把不是标记的所有字符传递给应用。一个进行验证的
XML处理器必须同时通知应用这些字符中的那一些组成了出现在元素内容
中的空白域。

可以在元素中附加一个名为xml:space的特殊属性,以通知应用应该保留
此元素中的空白域。在有效的文档中,此属性和其他属性一样,使用时必
须声明。它必须被声明为枚举类型,只有"default"和"preserve"两个可
能的值。例如:

    <!ATTLIST poem  xml:space (default|preserve) 'preserve'>

"default"表示可以对此元素使用应用的缺省空白域处理模式,"preserve"
表示应用应该保留所有的空白域。这适用于其所处元素的内容中的所有元
素,除非被另一个xml:space属性的实例所覆盖。

任何文档的根元素被认为对应用的空白域处理方式不作要求,除非它给此
属性赋了值或将此属性声明为带缺省值。

2.11 行尾处理
为编辑的方便起见,存储XML已析实体的计算机文档经常用行来组织。通常
这些行用回车符(#xD)和换行符(#xA)的一些组合来分隔。

为了使应用的工作简单化,对于一个外部已析实体或内部已析实体的字面实
体值中包含的任何双字符序列"#xD#xA"或单独的#xD,XML处理器都应换成
#xA传递给应用。(这可以通过在进行解析前将所有行定界符规范成#xA而方便
地实现。)

2.12 语言标识
在进行文档处理时,标识出其内容所使用的自然或形式化语言经常是很有用的
。可以在文档中插入一个名为xml:lang的特殊属性用于指出XML文档中任何元
素的内容和属性所使用的语言。在有效的文档中,此属性和其他属性一样,使
用时必须声明。此属性的值是[IETF RFC 1766],"语言标识码"中定义的语言标
识符:

语言标识
[33]  LanguageID ::=  Langcode ('-' Subcode)*
[34]  Langcode ::=  ISO639Code |  IanaCode |  UserCode
[35]  ISO639Code ::=  ([a-z] | [A-Z]) ([a-z] | [A-Z])
[36]  IanaCode ::=  ('i' | 'I') '-' ([a-z] | [A-Z])+
[37]  UserCode ::=  ('x' | 'X') '-' ([a-z] | [A-Z])+
[38]  Subcode ::=  ([a-z] | [A-Z])+

Langcode可以是下列值:

n       [ISO 639],"语言名称的表示码"中定义的双字母语言码。
n       在Internet Assigned Numbers Authority [IANA]注册的
语言标识码,以前缀"i-"(或"I-")开头。
n       用户指定或经各方同意的专用语言标识符,必须以前缀"x-"或"X-"开头
,以保证它们不会和以后经IANA标准化或在IANA注册的名字相冲突。

可以有任意多个子代码段(subcode),如果第一个子代码段存在,并且子代码由
两个字母组成,那么此子代码必须是[ISO 3166],"国家名称表示码"中定义的国
家代码。如果第一个子代码多于两个字母,那么它必须是在IANA注册的语言代码
所表示的语言的子代码,除非它Langcode以前缀"x-"或"X-"开头。


习惯上用小写字母给出语言代码,用大写字母给出国家代码(如果有的话)。注意
这些值与XML文档中的其他名字不同,是大小写无关的。

举例如下:

<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>

<p xml:lang="en-GB">What colour is it?</p>
<p xml:lang="en-US">What color is it?</p>
<sp who="Faust" desc='leise' xml:lang="de">
  <l>Habe nun, ach! Philosophie,</l>
  <l>Juristerei, und Medizin</l>
  <l>und leider auch Theologie</l>
  <l>durchaus studiert mit hei遝m Bem黨'n.</l>
  </sp>

xml:lang所表示的语言选择适用于它所处元素的所有属性和内容,除非被此内容
中的元素内的另一个xml:lang的实例所覆盖。


xml:lang的一个简单声明可以采用如下形式:

xml:lang  NMTOKEN  #IMPLIED

但是如果合适的话,也可以给出特定的缺省值。在一本供英国学生使用
的法文诗歌集中,评注和注解使用英语,xml:lang属性可以这样声明:

    <!ATTLIST poem   xml:lang NMTOKEN 'fr'>
    <!ATTLIST gloss  xml:lang NMTOKEN 'en'>
    <!ATTLIST note   xml:lang NMTOKEN 'en'>

3. 逻辑结构
每个XML文档包含一个或多个元素,它们的边界用起始标记和结束标记定界,或者
,对于空元素,用一个空元素标记分隔。每一个元素有一个用名字标识的类型,
有时称之为它的"通用标识符(generic identifier)"(GI),同时它可以有一个属

性说明(attribute specification)集。每个属性说明有一个名字和一个值。

元素
[39]    element ::=  EmptyElemTag | STag content ETag
  [ WFC: 元素类型匹配 ] [  VC: 元素有效 ]

除了那些开头匹配(('X'|'x')('M'|'m')('L'|'l'))的名字保留用于本规范的
此版本和后继版本的标准化外,本规范不对元素类型和属性的语义,用法和
名字(语法之外)作出限制。

格式约束: 元素类型匹配
元素结束标记中的Name必须和起始标记中的元素类型相匹配。

有效性约束: 元素有效
如果有一个与elementdecl相匹配的声明的Name与元素类型相匹配,且下述之
一成立时,称此元素是有效的:

1.     此声明与EMPTY相匹配,同时此元素没有内容。
2.此声明与children相匹配,同时子元素的序列属于内容模型中的正则表达
式所产生的语言,在每对子元素间允许有空白域(匹配非终结符S的字符)。
3.此声明与Mixed相匹配,同时内容由其类型匹配内容模型中的名字的字符数
据和子元素组成。
4.此声明与ANY? 唯一的属性说明
一个属性名只能在同一个起始标记或空元素标记中出现一次。

有效性约束: 属性值类型
属性必须被声明,其值必须是所声明的类型。(属性类型参见"3.3 属性表声
明"。)

格式约束: 无外部实体引用
属性值不能包含对外部实体直接或间接的实体引用。

格式约束: 在属性值中没有<
在一个属性值中直接或间接引用的实体的置换文本(除了"&lt;")不能包含<。

起始标记的一个例子:

<termdef id="dt-dog" term="dog">

由一个起始标记开始的每一个元素必须用一个结束标记标记其结束,结束标
记中的名字必须与起始标记中给出的元素类型相同:

结束标记
[42]  ETag ::=  '</' Name S? '>'


结束标记的一个例子:

</termdef>

在起始标记和结束标记中的文本被称为元素的内容:

元素的内容
[43]  content ::=  (element | CharData | Reference | CDSect | PI |
Comment)*

如果一个元素为空,它必须表示为一个起始标记紧跟一个结束标记或空元
素标记。一个空元素标记采用一种特殊的形式:

空元素标记
[44]  EmptyElemTag ::=  '<' Name (S Attribute)* S? '/>' [  WFC:
唯一的属性说明 ]


不论元素是否用关键字EMPTY声明,空元素标记都可以用于任何没有内容的
元素。出于互操作性考虑,空元素必须用于,且只能用于声明为EMPTY的元素。

空元素的例子:

<IMG align="left"
 src="http://www.w3.org/Icons/WWW/w3c_home" />
<br></br>
<br/>

3.2 元素类型声明
出于验证的目的,可以用元素类型和属性表声明限制XML文档中元素的结构
。元素类型声明限制了元素的内容。

元素类型声明通常限制了子元素的类型。由用户选择,当声明提到的元素
类型没有相应的声明时,XML处理器可以给出警告,但这不是一个错误。


元素类型声明形式如下:

元素类型声明
[45]  elementdecl ::=  '<!ELEMENT' S Name S contentspec S? '>' [
VC: 唯一的元素类型声明 ]
[46]  contentspec ::=  'EMPTY' | 'ANY' | Mixed | children


其中Name给出了所声明的元素类型。

有效性约束: 唯一的元素类型声明
元素类型只能声明一次。

元素类型声明的例子:

<!ELEMENT br EMPTY>
<!ELEMENT p (#PCDATA|emph)* >
<!ELEMENT %name.para; %content.para; >
<!ELEMENT container ANY>

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: 严格
的组/PE嵌套 ]
[50]  seq ::=  '(' S? cp ( S? ',' S? cp )* S? ')' [  VC: 严格的
组/PE嵌套 ]


其中每一个Name是可以作为子元素的元素的类型。选择表中出现的任意内
容粒子在元素内容中允许出现的位置对应于选择表在语法中的位置。序列
表中出现的所有内容粒子必须以相同的顺序出现在元素内容中。在名字或
表之后的可选字符(optional character)决定了表中元素或内容粒子可以
出现一次或多次(+),还是零次或多次(*),或是零次或一次(?)。没有这样
一个操作符意味着元素或内容粒子必须恰好出现一次。这种句法和意义和
本规范中的产生式中所使用的相同。

当且仅当一个元素的内容可以通过满足内容模型中的选择,序列和重复操
作符得到,并且内容中的每一个元素与内容模型中的一种元素类型相匹配
时,称此元素的内容与一个内容模型相匹配。出于兼容性考虑, 如果文
档的某个元素可以和内容模型中的一种元素类型多次匹配,这是一个错误。
 更详细的信息参见"E. 确定型内容模型".

有效性约束: 严格的组/PE嵌套
参数实体的置换文本用括号括起的组严格嵌套。即,如果choice,seq或
Mixed成分的开始或结束括号出现在某个参数实体的置换文敝一次。

混合内容声明的例子:

<!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
<!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* >
<!ELEMENT b (#PCDATA)>

3.3 属性表声明
属性用于联系名字-值对和元素。属性说明只能在起始标记和空元素标记
中出现; 因此,用于识别它们的产生式可参看"3.1 起始标记,结束标记和
空元素标记"中。属性表声明可以用于:

n       定义与一给定元素类型有关的属性集。
n       确定这些属性的类型限制。
n       提供属性的缺省值。

属性表声明详细说明了与给定元素类型相关联的每一个属性的名字,数
据类型和缺省值(如果有的话):

属性表声明
[52]  AttlistDecl ::=  '<!ATTLIST' S Name AttDef* S? '>'
[53]  AttDef ::=  S Name S AttType S DefaultDecl

AttlistDecl规则中Name是元素的类型。由用户选择,当元素类型中的属
性没有被声明时,XML处理器可以给出一个警告,但这不是一个错误。
AttDef规则中的Name是属性的名字。

当与某个给定元素类型相关的AttlistDecl超过一个时,这些声明中的内
容被合并在一起。当给定元素类型的某个属性的定义超过一个时,绑定
声明,一个给定的属性名至多有一个属性定义,以及每个属性表声明至
少有一个属性定义。出于互操作性考虑,当一个给定元素有超过一个的
属性表声明或一个给定属性有超过一个的属性定义时,由用户选择,
XML处理器可以给出警告,但这不是一个错误。
3.3.1 属性类型
XML属性有三种类型:字符串类型,一组记号化类型和枚举类型。字符
串类型可以以任意字面字符串为值; 各个记号化类型有不同的词法和
语义约束,如下:

属性类型
[54]  AttType ::=  StringType | TokenizedType | EnumeratedType
[55]  StringType ::=  'CDATA'
[56]  TokenizedType ::= 'ID' [ VC: ID ] [ VC: 每种元素类型一个
ID ] [VC: ID属性的缺省值 ]
      | 'IDREF' [  VC: IDREF ]
      | 'IDREFS' [  VC: IDREF ]
      | 'ENTITY' [  VC: 实体名 ]
      | 'ENTITIES' [  VC: 实体名 ]
      | 'NMTOKEN' [  VC: 名字记号 ]
      | 'NMTOKENS' [  VC: 名字记号 ]

有效性约束: ID
ID类型的值必须匹配Name产生式。作为此类型值的名字只能在XML文档中
出现一次;即,ID类型的值必须能唯一标识元素。

有效行声明的未析实体的名字。

有效性约束: 名字记号
NMTOKEN类型的值必须匹配Nmtoken产生式;NMTOKENS类型的值必须匹配
Nmtokens产生式。

枚举类型的属性可以在声明中提供的取值表中取值。有两种枚举类型:

枚举属性类型
[57]  EnumeratedType ::=  NotationType | Enumeration
[58]    NotationType ::=  'NOTATION' S '(' S? Name (S? '|'
S? Name)* S? ')'
[ VC: 符号属性 ]
[59]  Enumeration ::=  '(' S? Nmtoken (S? '|' S? Nmtoken)* S?
')' [  VC: 枚举 ]


一个NOTATION类型的属性标识了一种用于解释与此属性相关的元素的符
号,此符号用相关系统或公共标识符在DTD中声明。

有效性约束: 符号属性
此类型的值必须与声明中所包含的符号名之一相匹配;声明中的所有符号
名都必须声明。

有效性约束: 枚举
此类型的值必须与声明中所包含的Nmtoken记号之一相匹配。

出于互操作性考虑,同一Nmtoken只能在单个元素类型的枚举属性类型中
出现一次。

3.3.2 属性缺省值
属性声明提供的信息指明了某属性是否必须出现,同时指明了在被声明
的属性不是必须出现而文档中没有出现此属性的情况下,XML处理器应如何处理。

属性缺省值
[59]    DefaultDecl ::=  '#REQUIRED' | #IMPLIED'  | (('#FIXED'
 S)? AttValue)
[ VC: 必须的属性 ] [  VC: 合法的属性缺省值 ]
     [  WFC: 在属性值中无< ] [  VC: 固定的属性缺省值 ]


在一个属性声明中,#REQUIRED表示必须总是提供此属性,#IMPLIED表示
不提供缺省值。如果声明既不是#REQUIRED,也不是#IMPLIED,那么
AttValue值包含了所声明的缺省值;关键字#FIXED规定此属性必须总是有
缺省值。如果声明了一个缺省值,当XML处理器遇到一个被省略的属性时,
它将当成此属性以缺省值出现

有效性约束: 必须的属性
如果缺省值声明是关键字#REQUIRED,那么在所有此类型元素的属性表
声明中必须有此属性。

有效性约束: 合法的属性缺省值
被声明的属性缺省值必须满足被声明的属性类型的词法约束。

有效性约束: 固定的属性缺省值
如果某属性的缺省值用关键字#FIXED声明,此属性的所有实例必须匹
配该缺省值。

属性表声明的例子:

<!ATTLIST termdef
          id      ID      #REQUIRED
          name    CDATA   #IMPLIED>
<!ATTLIST list
          type    (bullets|ordered|glossary)  "ordered">
<!ATTLIST form

          method  CDATA   #FIXED "POST">

3.3.3 属性-值对的规范化(Attribute-Value Normalization)
在将属性的值传给应用或检验有效性之前,XML处理器必须将其规范化:

n       对字符引用的处理是将被引用的字符附加在属性值之后
n       对实体引用的处理是递归地处理实体的置换文本
n       对空白字符(#x20,#xD,#xA,#x9)的处理是将#x20附加在规
范化的值之后,例外是对作为外部已析实体或内部已析实体字面实体
值一部分的"#xD#xA"序列只附加一个#x20。
n       对于其他字符的处理是将它们附加与规范化的值之后

如果被声明的值不是CDATA,那么XML处理器必须继续处理规范化后的值
,去掉其前导和尾随空格(#x20)字符,并将空格(#x20)字符序列替换成
单个空格(#x20)字符。

不进行验证的语法分析器应该将所有尚未读到声明部分的属性当成被声
明为CDATA。

3.4 条件段(Conditional Sections)
条件段是文档类型声明外部子集的一部分,取决于相应的关键字,它们
或被包含在DTD逻辑结构之内,或被排除在DTD逻辑结构之外。

条件段
[61]  conditionalSect ::=  includeSect | ignoreSect
[62]  includeSect ::=  '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
[63]  ignoreSect ::=  '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64]  ignoreSectContents ::=  Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65]  Ignore ::=  Char* - (Char* ('<![' | ']]>') Char*)


同内部或外部DTD子集一样,条件段可以包含一个或多个完整的声明,注
释,处理指令,或嵌套的条件段,其间可以夹杂空白域。

如果条件段的关键字是INCLUDE,那么条件段的内容是DTD的一部分,如
果条件段的关键字是IGNORE,那么条件段的内容逻辑上不是DTD的一部分
。注意对于可靠的解析过程,即使被忽略的条件段的内容也必须被读取
以检测嵌套的条件段,保证最外层(被忽略)的条件段的结尾被恰当地检
测到。如果一个关键字为INCLUDE的条件段出现在更大的关键字为IGNORE
的条件段中,内外两个条件段都被忽略。

如果条件段的关键字是一个参数实体引用,处理器在决定是否包含或忽
略此条件段前,必须先将该参数实体置换成其内容。

一个例子:

<!ENTITY % draft 'INCLUDE' >
<!ENTIT鞘褂貌煌拿?;具有相同名字的参数
实体和通用实体是两个截然不同的两个实体。

4.1 字符和实体引用(Character and Entity References)
一个字符引用引用ISO/IEC 10646字符集中的一个特定字符。例如一个不
能用输入设备直接输入的字符。

字符引用
[66]  CharRef ::=  '&#' [0-9]+ ';'
      | '&#x' [0-9a-fA-F]+ ';' [  WFC: 合法字符 ]

格式约束: 合法字符
用字符引用引用的字符必须匹配Char产生式。

如果字符引用以"&#x"开头的数字和字母(直到终结)提供了某字符在
ISO/IEC 10646中代码的一个十六进制表示。如果它仅以"&#"开头的
数字(直到终结)提供了某字符的代码的十进值表示。

实体引用(entity reference)引用一个命名实体的内容。对已析普通
实体的引用使用"and"号(&)和分号(;)作为定界符。参数实体引用则使
用百分号(%)和分号(;)作为定界符。

实体引用
[67]  Reference ::=  EntityRef | CharRef
[68]  EntityRef ::=  '&' Name ';' [  WFC: 声明实体 ]
        [  VC: 声明实体 ]
        [  WFC: 已析实体 ]
        [  WFC: 无递归 ]
[69]  PEReference ::=  '%' Name ';' [  VC: 声明实体 ]
        [  WFC: 无递归 ]
        [  WFC: 在DTD内 ]


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

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

格式约束: 已析实体
实体引用不能包含一个未析实体的名字。未析实体只能在声明为
ENTITY或ENTITIES的属性值中引用。

格式约束: 无递归
已析实体不能直接或间接地包含对自身的递归引用。

格式约束: 在DTD内
参数实体引用只能在DTD中出现。

字符引用和实体引用的例子:

Type <key>less-than</key> (&#x3C;) to save options.
This document was prepared on &docdate; and
is classified &security-level;.

参数实体引用的例子:

<!-- declare the parameter entity "ISOLat2"... -->
<!ENTITY % ISOLat2  SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... now reference it. -->
%ISOLat2;

--
※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.90]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店