Skip to content

DTD 属性

在文档类型定义(DTD)中,元素的属性使用 <!ATTLIST> 声明来定义。

这个声明指定了属性所属的元素、属性名称、属性类型以及其默认值或要求。

注意: 在 DTD 中定义属性不如使用 XML Schema (XSD) 灵活,因为 XSD 提供了更丰富的数据类型和命名空间支持。在现代 XML 开发中,通常首选使用 XSD。

属性声明的基本语法是:

<!ATTLIST element-name attribute-name attribute-type attribute-default>

示例:

DTD declaration:
<!ATTLIST payment type CDATA "cash">
Corresponding XML element usage:
<payment type="check" />
<!-- 'type' attribute provided -->
<payment />
<!-- 'type' attribute omitted, defaults to "cash" -->

attribute-type 指定了属性可以持有的值类型。常见的类型包括:

类型描述
CDATA字符数据(一个文本字符串)
(val1|val2|..)枚举类型:值必须是指定列表中的一个
IDXML 文档中的一个唯一标识符(必须遵循 XML 名称规则)
IDREF引用另一个元素上声明的 ID
IDREFS一个由空格分隔的 IDREF 列表
NMTOKEN一个有效的 XML 名称标记(类似于名称,但允许更多字符)
NMTOKENS一个由空格分隔的 NMTOKEN 列表
ENTITY一个未解析的外部实体的名称
ENTITIES一个由空格分隔的 ENTITY 名称列表
NOTATION在 DTD 中声明的符号(Notation)名称

请注意,DTD 缺乏特定的数字、日期或布尔类型,与 XSD 相比这是一个主要的限制。

attribute-default 指定了属性是否必需以及如果省略时其值是什么:

默认值关键字解释
”defaultValue”指定如果属性在 XML 标签中不存在时的默认值。
#REQUIRED属性必须明确包含在 XML 标签中。
#IMPLIED属性是可选的。如果省略,处理 XML 的应用程序决定如何处理它的缺失(解析器不提供默认值)。
#FIXED “fixedValue”属性必须要么被省略(在这种情况下它取 fixedValue),要么包含且值正好是指定的 fixedValue。任何其他值都会导致验证错误。
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
Valid XML:
<square width="100" />
<square /> <!-- width defaults to "0" -->
DTD:
<!ELEMENT person EMPTY>
<!ATTLIST person number ID #REQUIRED>
Valid XML:
<person number="p5677" />
Invalid XML:
<person /> <!-- missing required 'number' attribute -->
DTD:
<!ELEMENT contact EMPTY>
<!ATTLIST contact fax CDATA #IMPLIED>
Valid XML:
<contact fax="555-667788" />
<contact /> <!-- 'fax' is optional -->
DTD:
<!ELEMENT sender EMPTY>
<!ATTLIST sender company CDATA #FIXED "MyCorp">
Valid XML:
<sender company="MyCorp" />
<sender /> <!-- company implicitly has value "MyCorp" -->
Invalid XML:
<sender company="OtherCorp" /> <!-- value must be "MyCorp" -->
DTD:
<!ELEMENT payment EMPTY>
<!ATTLIST payment type (cash | check | card) #REQUIRED>
Valid XML:
<payment type="check" />
<payment type="cash" />
Invalid XML:
<payment type="invoice" /> <!-- 'invoice' is not in the allowed list -->
<payment /> <!-- 'type' is required -->

枚举类型将属性值限制为预定义选项中的一个。