【问题标题】:How to make the attribute list extendable in DTD file如何使 DTD 文件中的属性列表可扩展
【发布时间】:2016-06-10 13:28:04
【问题描述】:

我想知道您是否对如何在 dtd 文件中释放属性类型有任何想法,例如

 <!ELEMENT Attribute (#PCDATA)>
  <ATTLIST name (code | permission)>

例如,如果我有几种类型的属性名称,我不能在 ATTLIST 声明中指定所有这些类型。 如何修改 ATTLIST 声明,使 xml 文件仍然有效,即使 例如,我有未在 DTD 中枚举的类型

<Attribute name="code">30</Attribute>
<Attribute name="non_declared_name_type>"value"</Attribute>

提前谢谢你。

【问题讨论】:

    标签: java dtd


    【解决方案1】:

    如果您希望Attribute 元素上的name 属性与codepermission 或任何XML 名称中的任何一个匹配,那么这相当于您希望它与任何XML 名称匹配。使用 DTD 的最接近的近似值是

    <!ATTLIST Attribute name NMTOKEN #REQUIRED>
    

    此声明假定该属性是必需的。

    对于这样的“半封闭”值列表,它们具有一些枚举值但可以接受其他值,使用 DTD 时通常有两种方法。

    (a) 可以如上所示声明它们,并确保 DTD 的用户知道枚举值,以便他们在适当的时候使用这些值,并且不要发明拼写这些名称的新方法,通过在文档中列出枚举值和/或在 DTD 本身中添加注释:

    <!--* Expected values include 
        *
        * 'code' (to be used when ... or ...)
        * 'permission' (to be used for ... and ...).
        *
        * Use other values only if necessary. *-->
    <!ATTLIST Attribute name NMTOKEN #REQUIRED>
    

    (b) 可以将属性一分为二:一个用于已知值,加上一个特殊值(如“其他”),另一个用于其他值。

    <!ATTLIST Attribute 
              name (code | permission | other) #REQUIRED
              other_name NMTOKEN #IMPLIED >
    

    这会将枚举值显式地放入 DTD,并允许使用枚举的软件找到它们(例如,将它们放入用户界面中的选择列表中),同时仍然允许其他值。那么使用未声明的值就变成了

    <Attribute name="other" other_name="non_declared_name_type"
      >"value"</Attribute>
    

    【讨论】:

    • 谢谢 Sperberg 的回答,我使用了这个语法,它对我有用: 你能从你的经验告诉我有什么区别,什么更好采用? (固执己见,但想知道优势并了解原因)
    • 对 XML 的任何好的介绍都应该让您很好地理解 CDATA(它接受任何 XML 字符序列)和 NMTOKEN(它只接受 XML 名称中的合法字符)之间的区别。对于 CDATA,Hi, mom!34 * 27 + 3.4 等值是有效的;对于 NMTOKEN,它们不是,因为空格、逗号、感叹号、星号和加号不是名称字符。我猜测你会对 NMTOKEN 做得更好是基于猜测属性 Attribute/@name 的用途。
    猜你喜欢
    • 2022-07-28
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2014-05-15
    相关资源
    最近更新 更多