【问题标题】:Specify a multi-word enumeration value in an XML/DTD在 XML/DTD 中指定多字枚举值
【发布时间】:2012-09-21 07:45:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

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

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

    <SystemName Case="MIXED_RESPECT">...
    

    作者可以写作

    <SystemName MIXED_RESPECT>...
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多