В. А. Капустин Содержание Формальные структуры текстовых документов 1 Курс лекций

Вид материалаКурс лекций
Ещё несколько слов про XML
DeclSep – разделители (пробельный материал, инструкции обработки и комментарии); conditionalSect
Условные разделы объявления типа документа
INCLUDE, написанное заглавными буква­ми
Применение условных разделов объявления типа документа
INCLUDE или IGNORE
Подобный материал:
1   ...   9   10   11   12   13   14   15   16   17

Лекция 5.TEI


Основное назначение TEI, в отличие от DocBook, заключается не в передаче логической структуры документа, а в выделении в документе тех его составляющих, которые необхо­ди­мы для конкретных целей (исследования, поиска и пр.). При этом могут оставаться без внимания (и, следовательно, без разметки) многие другие элементы структуры текста. Как и DocBook, TEI позволяет размечать документы различного уровня: от корпуса (соб­ра­ния документов, не имеющего аналога в DocBook) до фрагмента технической документации.

TEI, в отличие от DocBook, не представляет собой единственное объявление типа доку­мен­та. TEI имеет модульную структуру, позволяющую собирать DTD для конкретного при­ме­не­ния из нескольких десятков модулей. Для управления такой сборкой в TEI ис­пользован механизм условных разделов DTD. Поэтому сначала рассмотрим этот меха­низм.

Ещё несколько слов про XML


Общая структура DTD содержит внешнее и внутреннее ограничения (7, разд. 2.8):

' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'

ExternalID указывает на внешний по отношению к DTD ресурс (URL или файл), со­дер­жащий часть объяв­лений (сущностей, элементов и атрибутов); текст этого ре­сур­са называется внешним ограничением (для того XML-документа, который будет свя­зан с рассматриваемым DTD);

intSubset содержит объявления, об­ла­дающие приоритетом по отношению к объяв­лениям, содержащимся во внешнем ограничении; эта совокупность объявлений называется внутренним ограничением.

В принципе, структура текста внутреннего и внешнего ограничений имеет единственное отличие (7, разд. 2.8): в части DTD, вынесенной во внешнее ограничение (или во внешние параметри­ческие сущности) допускается использование так называемых условных разделов (conditional sections):

intSubset ::= ( markupdecl | DeclSep)*

extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*

markupdecl представляет объявления (сущностей, элементов и атрибутов);

DeclSep – разделители (пробельный материал, инструкции обработки и комментарии);

conditionalSect – те самые условные разделы, которые мы сейчас и рассмотрим.

Условные разделы объявления типа документа


Условный раздел имеет следующую структуру (следующие 5 правил приведены в 7, разд. 3.4; я сохранил нумерацию правил):

[61] conditionalSect ::= includeSect | ignoreSect
[62] includeSect ::= ' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
[63] ignoreSect ::= ' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64] ignoreSectContents ::= Ignore (' ignoreSectContents ']]>' Ignore)*
[65] Ignore ::= Char* - (Char* (' | ']]>') Char*)

Интерпретация этих правил проста:

[61] – условный раздел может представлять включаемый или исключаемый раздел.

[62]включаемый раздел оформляется как начало DTD (), за которым (через не­обя­зательные пробелы) следует слово INCLUDE, написанное заглавными буква­ми, за ко­торым через необязательные пробелы следует открывающая угловая скобка. За ней на­ходится содержимое включаемого раздела, представляющее собой всё то, что допус­ти­мо во внешнем ограничении, – т.е. объявления, разделители и снова условные разде­лы. Заканчивается включаемый раздел так же, как и DTD – ']]>'.

[63]исключаемый раздел начинается так же, как и включаемый, но вместо INCLUDE используется слово IGNORE, также написанное заглавными буквами. И закан­чивается исключаемый раздел так же, как и включаемый. Однако тело исключаемого раздела определено двумя последующими правилами. Эти правила удобнее проком­мен­тировать в обратном порядке.

[65] – игнорировать любой текст (в том числе и пустой), в котором нет характерных для DTD сочетаний сим­волов: ' и ']]>'. Такой текст будем называть игно­ри­ру­емым.

[64]тело исключаемого раздела – это игнорируемый текст, за которым, воз­мож­но, идут пары, состоящие из заключенного в ' и ']]>' тела исключаемого раз­дела и игнорируемого текста. Это правило необходимо для подсчета «открыва­ю­щих» (') и «закрывающих» (']]>') DTD-скобок – в теле исключаемого раз­дела они должны быть строго вложены (когда встречается невложенная закрывающая DTD-скобка, исключаемый раздел считается законченным).

Семантика включаемого раздела проста: его текст включается в DTD, используемое XML-процессором при анализе документа. При этом выполняются обычные действия, на­пример, подстановка значений параметрических сущностей.

Семантика исключаемого раздела сложнее. Тело исключаемого раздела полностью игнорируется XML-процессором: игнорируется наличие включаемых разделов, вложен­ных в исключа­емый раздел; подстановка значений сущностей не выполняется, инструк­ции обработки игнорируются и т.д.

Применение условных разделов объявления типа документа


Пример условных разделов объявления типа документа

% draft 'INCLUDE' >
% final 'IGNORE' >

book (comments*, title, body, supplements?)>
]]>

book (title, body, supplements?)>
]]>

Приведённый пример иллюстрирует использование условных раз­де­лов объявления типа документа: в DTD включается весь текст, который может/должен быть использован в раз­личных ситуациях применения DTD, сами ситуации обозначаются параметрическими сущностями, имеющими значения INCLUDE или IGNORE; части тек­с­та DTD, которые дол­ж­ны быть использованы в соответствующей ситуации, включаются в раздел, в котором вместо ключевых слов INCLUDE или IGNORE использована ссылка на параметрическую сущность. Замена значений сущностей изменит DTD:

% draft 'IGNORE' >
% final 'INCLUDE' >

TEI использует сотни параметрических сущностей со значениями INCLUDE или IGNORE, что, с одной стороны, позволяет производить тонкую настройку DTD, но, с другой сторо­ны, требует тщательного изучения DTD TEI.