DTD中ATTLIST声明属性须按顺序写全四部分:元素名、属性名、属性类型、默认声明;常用类型有CDATA、ID、IDREF、枚举和NMTOKENS;默认声明包括#REQUIRED、#IMPLIED、#FIXED"值"或直接字符串。

DTD 中用 ATTLIST 声明元素的属性,语法固定、逻辑清晰,关键在写对四部分:元素名、属性名、属性类型、默认声明(含约束条件)。
基本语法结构
必须按顺序写出这四个成分,缺一不可(除非默认声明被省略且满足规则):
-
元素名:该属性归属的 XML 元素名称,如
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 就会报错。










