3

我编写了以下 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 编写的库也可以。

4

2 回答 2

4

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

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

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

 <!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)>
 ]>
于 2012-12-11T15:28:38.203 回答
3

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

SGML 的“默认”语法称为“参考具体语法”,在 ISO 8879:1986 中定义。因为在这个语法中名字的最大长度(所谓的“ NAMELEN 数量”)被设置为 8(八),而 LOW LINE ( _) 不能用在名字中(不是所谓的名字字符),您的 DTD对于参考具体语法是无效的。

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


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

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


channel_name为like添加一个简单的声明

<!ELEMENT channel_name (#PCDATA)>

补救措施——现在例如文档元素

<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-12-11T04:18:05.517 回答