Проверить SGML DTD

Я написал следующий 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 ответа

Решение

Посмотрите на SP от Джеймса Кларка. Я использую OmniMark для проверки SGML, но я не думаю, что вы сможете найти копии больше.

Вы должны получить ошибки о минимизации тегов (вам нужно пробелы до / после / между --). Вы также должны получить ошибки об элементе channel быть объявленным дважды, и ошибка об "es" в lang объявление атрибута для 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)>
 ]>

Обратите внимание, что "действительный SGML DTD" технически немного двусмысленен: это зависит от того, в какой части "декларация SGML" используется, где указываются такие вещи, как максимальная длина имени или даже то, какие символы могут встречаться в имени. Это " конкретный синтаксис ", используемый в определенном DTD (и, следовательно, в конкретном документе SGML).

Синтаксис "по умолчанию" для SGML называется " синтаксис конкретного эталона " и определен в ISO 8879:1986. Потому что в этом синтаксисе максимальная длина имен (так называемое " количество NAMELEN ") устанавливается равной 8 (восемь) и LOW LINE (_) не может использоваться в именах (это не так называемый символ имени), ваш DTD не будет действителен по отношению к конкретному синтаксису ссылки.

HTML, например, использует свою собственную декларацию SGML: он значительно увеличивает количество NAMELEN и добавляет _ к именам персонажей, среди прочих изменений. Что касается этого конкретного синтаксиса, ваш 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 " - эти термины (снова из 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>
Другие вопросы по тегам