computer 版 (精华区)

发信人: lyl (一条四处游荡的鱼), 信区: network
标  题: [范文][XML]W3C建议XML 1.0中文版说明(六) (转载) 
发信站: 听涛站 (Fri Apr 28 21:12:15 2000), 转信

发信人: DDG (导弹驱逐舰~雾的季节), 信区: XML
标  题: [范文][XML]W3C建议XML 1.0中文版说明(六) (转载)
发信站: BBS 水木清华站 (Thu Apr  6 13:29:36 2000)

【 以下文字转载自 New_board 讨论区 】
【 原文由 starw 所发表 】
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超过一个时,这些声明中的内容被合并在
一起。当给定元素类型的某个属性的定义超过一个时,绑定第一个定义,其余定义
被忽略。出于互操作性考虑,DTD的作者可以选择一个给定的元素类型至多有一个属
性表声明,一个给定的属性名至多有一个属性定义,以及每个属性表声明至少有一
个属性定义。出于互操作性考虑,当一个给定元素有超过一个的属性表声明或一个
给定属性有超过一个的属性定义时,由用户选择,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类型的值必须能唯一标识元素。

有效性约束: 每种属性类型一个ID
每种属性类型只能有一个ID属性。

有效性约束: ID属性的缺省值
ID属性必须有一个声明为#IMPLIED或#REQUIRED的缺省值。

有效性约束: IDREF
IDREF类型的值必须匹配Name产生式,IDREFS类型的值必须匹配Names产生式;每一
个Name必须匹配XML文档中某些元素ID属性的值;也就是说,IDREF类型的值必须匹
配某些ID属性的值。

有效性约束: 实体名
ENTITY类型的值必须匹配Name产生式,ENTITIES类型的值必须匹配Names产生式;每
一个Name必须匹配DTD中声明的未析实体的名字。

有效性约束: 名字记号
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规定此属性必须总是有缺省值。如果声明了一个缺省值,当X
ML处理器遇到一个被省略的属性时,它将当成此属性以缺省值出现

有效性约束: 必须的属性
如果缺省值声明是关键字#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 ']]>' Ign
ore)*
[65]  Ignore ::=  Char* - (Char* ('<![' | ']]>') Char*)


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

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

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

一个例子:

<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >

<![%draft;[
<!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final;[
<!ELEMENT book (title, body, supplements?)>
]]>

--
        山居且喜远纷华,俯仰乾坤野性赊。
                千载勋名身外影,百岁荣辱镜中花。

        金 琢 倒秋将暮,蕙径萧瑟日且斜。
                闻道五湖烟境好,何   蝮业鐾∩场?


--
与其相濡以沫,不若相望于江湖。

http://10.23.31.91/
http://10.23.31.91:9999

※ 来源:.听涛站 cces.net.[FROM: 匿名天使的家]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:1.323毫秒