2016-10-20 5 views
2

У меня есть следующий fake.dtd файл:DTD Ошибка проверки символьных данных из-за LineBreak

<!ELEMENT outer - - (#PCDATA, foo, bar) > 
<!ELEMENT foo - o (#PCDATA) > 
<!ELEMENT bar - - (#PCDATA) > 

И следующий документ SGML:

<!DOCTYPE outer SYSTEM "fake.dtd"> 
<OUTER>Document Title 
    <FOO>1234 
    <BAR>wxyz</BAR> 
</OUTER> 

Я получаю сообщение об ошибке проверки с помощью nsgmls:

4: 19: E: символьные данные здесь не допускаются

Отметьте, что установка </OUTER> на эту же строку </BAR> решает проблему; ошибка относится к разрыву строки.

Есть ли способ сохранить SGML как есть (потому что у меня уже есть тысячи таких документов), но измените DTD так, чтобы он проверял?

Добавление другого #PCDATA в конец элемента outer кажется глупым, потому что это сделало бы символы, отличные от новой строки законными.

ответ

1

Стандарт SGML (ISO 8879: 1986/A1: 1988, 11.2.4) явно рекомендует не использовать модели содержания, как (#PCDATA, foo, bar) (курсив мой):

Примечание - Рекомендуется, чтобы « #PCDATA "использовать только , когда символы данных должны быть разрешены в любом месте содержимого элемента; то есть в модели контента, где это единственный токен, или , гдеor- единственный разъем, используемый в любой группе.

Несмотря на упоминании #PCDATA только как первый символ в группе, ваш outer типа элемента еще объявляется иметь смешанные содержимое, поэтому символы данных могут происходить в любом месте: именно поэтому разрыв строки (так называемая «пластинка конец») после того, как </BAR> распознаются как символ данных вместо просто сепаратора с одной стороны, но нет соответствующего #PCDATA маркера, чтобы поглотить его с другой стороны, отсюда и ошибка. (И только пропущенный конечный тег </FOO> обошел ту же ошибку в строке раньше!)


Надлежащий и общий подход в этом случае было бы поместить «Document Title» в фактический title элемент —, для которых один может позволить упущение как пуско-и конечных тегов:

<!ELEMENT outer - - (title, foo, bar) > 
<!ELEMENT title o o (#PCDATA) > 

Теперь

  • ваш экземпляр документа действует без изменений,
  • модель outer содержания по-прежнему отражает надлежащий порядок элементов,
  • outer элемента содержимые элемента (не больше смешанное содержание),
  • и «Название документа» Текст заканчивается в его собственный элемент title, как и должно быть.

(Тот же метод используется в нескольких стандартных ОТД, как в примере «General Document» в приложении   E стандарта.)

0

Пробелы, которые выглядят безобидными, на самом деле являются значительными символьными данными, что приводит к ошибке. Это иногда называют «пагубным смешанным контентом». Вы уже намекнули на решение (разрешение #PCDATA после bar элемента):

<!ELEMENT outer - - (#PCDATA, foo, bar, #PCDATA) > 

Другим вариантом является возможность #PCDATA и элементы в любом порядке (это как смешанный контент должен быть объявлен в XML):

<!ELEMENT outer - - (#PCDATA|foo|bar)* > 

Я ничего не могу придумать. Невозможно ограничить контент #PCDATA определенными символами.