验证SGML DTD

时间:2012-12-11 11:14:15

标签: validation dtd sgml

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

2 个答案:

答案 0 :(得分:4)

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

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

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

program

答案 1 :(得分:3)

请注意,“有效的SGML DTD”在技术上有点含糊不清:它取决于使用哪个“SGML声明”,即指定事物的位置,如 name 的最大长度或甚至哪些字符可以出现在名称中。这是特定DTD中使用的“具体语法”(因此在特定的SGML文档中)。

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

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

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

因此,在您无法编写任何文档元素(即tvguide元素,或简称“文档”)的意义上,DTD(尚未)“有效”根据它是有效的。

channel_name添加简单的声明,例如

<!ELEMENT channel_name (#PCDATA)>

补救措施 - 例如文档元素

<tvguide>
  <date>2016</date>
  <channel><channel_name>XTV</channel_name></channel>
</tvguide>
根据您的DTD,

有效。 (我尝试使用SP解析器,在另一个答案中提到。)

简化DTD中的名称会使整个事物成为有效的“基本SGML文档”,甚至是有效的“最小SGML文档” - 这些术语(再次当没有给出特定的上下文和SGML声明时,来自ISO 8879)最接近“有效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>