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