DTD中ATTLIST声明属性须按顺序写全四部分:元素名、属性名、属性类型、默认声明;常用类型有CDATA、ID、IDREF、枚举和NMTOKENS;默认声明包括#REQUIRED、#IMPLIED、#FIXED"值"或直接字符串。
DTD 中用 ATTLIST 声明元素的属性,语法固定、逻辑清晰,关键在写对四部分:元素名、属性名、属性类型、默认声明(含约束条件)。
必须按顺序写出这四个成分,缺一不可(除非默认声明被省略且满足规则):
book、person
id、lang
CDATA、ID、IDREF、(a|b|c)(枚举)、NMTOKEN、ENTITY 等#REQUIRED、#IMPLIED、#FIXED "值",或直接写一个默认字符串(如 "en")这是最容易出错的地方——不同约束对应不同的写法要求:
#REQUIRED:XML 实例中必须显式写出该属性,不能省略,也不允许写空值;后面不能跟默认值
#IMPLIED:完全可选,不写也合法;后面不能跟默认值
#FIXED "xxx":属性值强制为指
定字符串;XML 中可以不写这个属性,解析器会自动补上;必须带引号内的值
"default"):表示该属性可选,若未提供则取此默认值;不能和 #REQUIRED / #IMPLIED / #FIXED 同时出现
不是所有类型都常用,掌握以下五种就够应付绝大多数场景:
CDATA:任意文本,支持中文、数字、符号,最通用ID:必须全局唯一、符合标识符规则(如不能以数字开头),用于锚点或引用IDREF:值必须是文档中某个 ID 属性的值,实现单向关联(html|xml|json):枚举类型,只允许括号内列出的几个值之一NMTOKENS:多个合法标识符,用空格分隔,适合标签、权限列表等推荐把同一元素的所有属性写在一条 ATTLIST 中,结构紧凑、易维护:
title CDATA #REQUIRED
category (fiction|nonfiction|reference) "fiction"
published CDATA #IMPLIED
version CDATA #FIXED "1.0">
这样定义后, 是合法的,而漏掉 id 或 title 就会报错。