首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证SGML DTD

验证SGML DTD
EN

Stack Overflow用户
提问于 2012-12-11 19:14:15
回答 2查看 1.1K关注 0票数 3

我编写了以下SGML DTD:

代码语言:javascript
复制
<!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编写的库也可以。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-11 23:28:38

看看SP from James Clark吧。我使用OmniMark来验证SGML,但是我想你再也找不到副本了。

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

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

代码语言:javascript
复制
 <!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)>
 ]>
票数 4
EN

Stack Overflow用户

发布于 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添加一个简单的声明,比如

代码语言:javascript
复制
<!ELEMENT channel_name (#PCDATA)>

补救措施-例如,现在的文档元素

代码语言:javascript
复制
<tvguide>
  <date>2016</date>
  <channel><channel_name>XTV</channel_name></channel>
</tvguide>

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

简化DTD中的名称将使整个事物成为有效的“基本SGML文档”,甚至一个有效的“最小SGML文档”-these术语(同样来自ISO8879)在没有给定特定上下文和SGML声明的情况下也最接近于“有效SGML”的概念:它们基本上意味着“可移植并可被任何SGML系统接受”。以下是我提出的版本:

代码语言:javascript
复制
<!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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13819161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档