【问题标题】:validate SGML DTD验证 SGML DTD
【发布时间】:2012-11-28 22:35:29
【问题描述】:

我编写了以下 SGML DTD:

<!DOCTYPE tvguide[
    <!ELEMENT tvguide--(date,channel+)>
    <!ELEMENT date--(#PCDATA)>
    <!ELEMENT channel--(channel_name,format?,program*)>
    <!ELEMENT channel--(#PCDATA)>
    <!ATTLIST channel teletext (yes|no) "no">
    <!ELEMENT format--(#PCDATA)>
    <!ELEMENT program--(name,start_time,(end_time|duration))>
    <!ATTLIST program
        min_age CDATA #REQUIRED
        lang CDATA #IMPLIED es>
    <!ELEMENT name--(#PCDATA)>
    <!ELEMENT start_time--(#PCDATA)>
    <!ELEMENT end_time--(#PCDATA)>
    <!ELEMENT duration--(#PCDATA)>]>

我应该使用哪个工具来检查是否有任何语法错误,在哪里,以及它是否是有效的 SGML DTD?

我应该使用哪个工具来验证使用此 DTD 的文件?我更喜欢 Windows 程序,但 Linux 二进制文件或用 PHP、C、C++、Java 或 Javascript 编写的库也可以。

【问题讨论】:

    标签: validation dtd sgml


    【解决方案1】:

    看看SP from James Clark。我使用 OmniMark 来验证 SGML,但我认为您再也找不到副本了。

    你应该得到关于标签最小化的错误(你需要在--之前/之后/之间有空格)。您还应该得到关于元素 channel 被声明两次的错误以及关于 programlang 属性声明中的“es”的错误。

    这是一个可供参考的有效版本:

     <!DOCTYPE tvguide [
     <!ELEMENT tvguide - - (date,channel+)>
     <!ELEMENT date - - (#PCDATA)>
     <!ELEMENT channel - - (channel_name,format?,program*)>
     <!ATTLIST channel teletext (yes|no) "no">
     <!ELEMENT format - - (#PCDATA)>
     <!ELEMENT program - - (name,start_time,(end_time|duration))>
     <!ATTLIST program
          min_age CDATA #REQUIRED
          lang CDATA "es">
     <!ELEMENT name - - (#PCDATA)>
     <!ELEMENT start_time - - (#PCDATA)>
     <!ELEMENT end_time - - (#PCDATA)>
     <!ELEMENT duration - - (#PCDATA)>
     ]>
    

    【讨论】:

    • Omnimark 仍可从 Stilo International PLC 获得。我不知道 Omnimark 是否还包含 SGML 解析器,但如果包含,我不会感到惊讶。
    • @C.M.Sperberg-McQueen - 感谢您提供链接。几年前,我就许可事宜联系了 Stilo,但从未收到回音。我还在用 5.3。
    • @Daniel,听起来你的名字后面没有足够的零;-)
    【解决方案2】:

    请注意,“有效的 SGML DTD”在技术上有点模棱两可:它取决于所使用的“SGML 声明”,这是指定诸如 名称 的最大长度或甚至可以在 name 中出现哪些字符。这就是在特定 DTD 中使用的“具体语法”(因此在特定的 SGML 文档中)。

    SGML 的“默认”语法称为“参考具体语法”,在 ISO 8879:1986 中定义。因为在这种语法中,名称的最大长度(所谓的“NAMELEN 数量”)设置为 8(八),而 LOW LINE (_) 不能用于 names(它不是所谓的 name character),您的 DTD not对于 reference 具体语法是有效的/em>。

    HTML——例如——使用自己的SGML declaration:它极大地增加了NAMELEN 数量,并在名称字符中添加了_,以及其他一些变化。对于这种具体的语法,您的 DTD 确实是语法有效的。


    但是channel_name 没有元素声明,但是 DTD 要求在 tvguide 中至少存在一个这样的元素(即包含在所需元素 channel 中) . [省略文档中未出现的元素类型的声明本身并不是错误或问题。]

    因此,从您不能编写任何有效的文档元素(即tvguide 元素,或简单的“文档”)的意义上说,DTD 不是(还)“有效”根据它。


    channel_name like 添加一个简单的声明

    <!ELEMENT channel_name (#PCDATA)>
    

    补救措施——现在例如 document 元素

    <tvguide>
      <date>2016</date>
      <channel><channel_name>XTV</channel_name></channel>
    </tvguide>
    

    有效根据您的 DTD。 (我使用另一个答案中提到的 SP 解析器进行了尝试。)


    简化 DTD 中的名称将使整个内容成为有效的“基本 SGML 文档”,甚至是有效的“最小 SGML 文档”——这些术语(再次来自 ISO 8879)在没有给出特定上下文和 SGML 声明时最接近“有效 SGML”的概念:它们基本上意味着“任何 SGML 系统都可以移植和接受”。这是我建议的版本:

    <!DOCTYPE tvguide [
     <!ELEMENT tvguide  - - (date,channel+)>
     <!ELEMENT date     - - (#PCDATA)>
    
     <!ELEMENT channel  - - (ch-name,format?,program*)>
     <!ATTLIST channel
               teletext (yes|no) no>
    
     <!ELEMENT format   - - (#PCDATA)>
     <!ELEMENT ch-name  - - (#PCDATA)>
    
     <!ELEMENT program  - - (name,start-tm,(end-tm|duration))>
     <!ATTLIST program
               min-age  CDATA    #REQUIRED
               lang     CDATA    "es">
    
     <!ELEMENT name     - - (#PCDATA)>
     <!ELEMENT start-tm - - (#PCDATA)>
     <!ELEMENT end-tm   - - (#PCDATA)>
     <!ELEMENT duration - - (#PCDATA)>
    ]>
    <tvguide>
     <date>2016-12-11</date>
     <channel><ch-name>X-TV 4</ch-name></channel>
    </tvguide>
    

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2016-01-18
      • 2010-11-22
      • 1970-01-01
      • 2016-09-18
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多