2

在为 DTD 属性定义指定枚举值列表时,是否可以使用多字值?

      <!ATTLIST SystemName Case ("MIXED RESPECT"|"MIXED IGNORE"|"LOWER RESPECT"|"LOWER IGNORE"|"UPPER RESPECT"|"UPPER IGNORE") "MIXED IGNORE">

我尝试将值放在引号中(如图所示),而不是引号。我一直在阅读有关符号和 nmtoken 的信息,但我看到的每个地方似乎都在说“请参阅 blah-blah 规范”,但没有一个例子。示例价值大约一百万页的规范。

4

1 回答 1

4

不,枚举值不能包含空格;每个枚举值都必须是合法的 NMTOKEN,这意味着它必须是可以出现在 XML 名称中的字符序列。所以 MIXED、Mixed、RESPECT、MIXED-RESPECT 和 MIXED_RESPECT 是枚举中的合法值,但不是“MIXED RESPECT”。对不起。

其价值的原因是历史性的:在 SGML(从中派生出 XML)中,如果使用可能值的枚举列表声明属性名称,则该语言的一个可选特性允许省略属性名称。所以而不是

<SystemName Case="MIXED_RESPECT">...

作者可以写

<SystemName MIXED_RESPECT>...

而不是<table border="noborder">or<table border="border">作者可以只写<table border>or <table noborder>。为了确保这些值在上下文中是可解析的,它们被限制为合法的 NMTOKEN。

该功能的一个缺点是,为了确保这个魔术总是可行的,SGML 禁止任何两个属性的枚举值重叠,所以你不能有两个属性与yesno作为合法值(因为那时一个解析器看到<table yes>可能不知道它是否意味着border="yes"compact="yes")。

XML 中删除了最小化功能(就像所有其他使编写 SGML 解析器如此冒险的最小化功能一样),但保留了使其成为可能的约束,以确保所有 XML DTD 都作为 SGML 合法DTD。

于 2012-09-20T23:45:41.783 回答