我编写了以下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编写的库也可以。
发布于 2012-12-11 23:28:38
看看SP from James Clark吧。我使用OmniMark来验证SGML,但是我想你再也找不到副本了。
你应该会得到关于标签最小化的错误(你需要在--之前/之后/之间留出空格)。您还应该得到关于元素channel被声明两次的错误,以及关于program的lang属性声明中的"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)>
]>发布于 2016-12-11 12:18:06
请注意,“有效的SGML DTD”在技术上有点模棱两可:它取决于使用哪个"SGML声明“,其中指定了名称的最大长度,甚至名称中可以出现哪些字符。这是在特定的DTD中使用的“具体语法”(因此在特定的SGML文档中也是如此)。
SGML的“默认”语法被称为“参考具体语法”,并在ISO 8879:1986中定义。因为在这种语法中,名称的最大长度(所谓的"NAMELEN数量“)被设置为8(8),并且不能在名称中使用低行(_) (它不是所谓的名称字符),所以相对于引用的具体语法,您的DTD将是有效的。
例如,超文本标记语言使用自己的SGML declaration:它极大地增加了名称的数量,并将_添加到名称字符中,以及其他更改。关于这个具体的语法,您的DTD在语法上确实是有效的。
但是没有针对channel_name的元素声明,但是DTD要求tvguide中至少有一个这样的元素(即,包含在所需的元素channel中)。省略文档中未出现的元素类型的声明本身并不是错误或问题。
因此,DTD并不是“有效的”,因为您不能根据它编写任何有效的文档元素(即tvguide元素或简单的“文档”)。
为channel_name添加一个简单的声明,比如
<!ELEMENT channel_name (#PCDATA)>补救措施-例如,现在的文档元素
<tvguide>
<date>2016</date>
<channel><channel_name>XTV</channel_name></channel>
</tvguide>根据您的DTD是有效的。(我使用了另一个答案中提到的SP解析器进行了试验。)
简化DTD中的名称将使整个事物成为有效的“基本SGML文档”,甚至一个有效的“最小SGML文档”-these术语(同样来自ISO8879)在没有给定特定上下文和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>https://stackoverflow.com/questions/13819161
复制相似问题