Языки информационного обмена

Атрибуты

Для того чтобы при определении элемента задать какие-либо параметры, уточняющие характеристики данного элемента используются атрибуты.
Атрибуты состоят из пары "название" = "значение", которую можно задавать при определении элемента в начальном тэге. Слева и справа от символа равенства можно оставлять пробелы. Значение атрибута указывается в виде строки, заключенной в одинарные или двойные кавычки.
Любой тэг может иметь атрибут, если этот атрибут определен.
В случае использования атрибута элемент принимает следующую форму:
<имя_тега атрибут = "значение"> содержимое тега
Пример:

текст выравнивается по центру

В одном открывающемся теге может содержаться несколько атрибутов, например:
Указан размер и цвет текста

Что такое XML

Свое название расширяемый язык разметки XML (Extensible Markup Language) получил по той причине, что в нем нет фиксированного формата, как в HTML. В то время как язык HTML ограничивается набором твердо закрепленных тегов, пользователи XML могут создавать свои собственные тэги, которые бы отвечали тематики документа. Таким образом, XML - это метаязык. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов.
Документ XML выглядит во многом похожим на HTML. В XML существуют открывающие, закрывающие и пустые тэги. Однако, в отличие от HTML, правила относительно тегов более строгие, например, смысл тега зависит от регистра, а каждый открывающий тег должен во всех случаях иметь парный закрывающий тег. Теги в документе могут быть вложены друг в друга. Теги начала и конца элемента являются основными используемыми в XML разметками, но ими дело не исчерпывается. Так же как и в HTML тэги могут иметь атрибуты, причем количество атрибутов зависит от фантазии автора. Документы XML могут содержать ссылки на другие объекты. Ссылки представляют собой строку, начинающуюся с амперсанта и заканчивающуюся точкой с запятой. Ссылки позволяют, в частности, вставить в документ специальные символы, включение которых самих по себе могло бы сбить с толку программу разбора. К тому же ссылки могут ссылаться на определенные автором разделы текста в том же самом или в другом документе. Для того чтобы используемые вами в документе теги понимали и другие необходимо составить определения типов документов (Document Type Definition, DTD). Хранимые в начале файла XML или внешним образом в виде файла, эти определения описывают информационную структуру документа. DTD перечисляют возможные имена элементов, определяют имеющиеся атрибуты для каждого типа элементов и описывают иерархию элементов. Сам XML документ не несет информацию о том как находящиеся в нем данные должны отображаться на экране, за это отвечает таблица стилей. Таким образом, в документе имеется разграничение между оформлением и содержанием.
Подводя итоги можно сказать, что основными достоинствами XML являются:
  • авторы XML-документов могут создавать свои собственные тэги, относящиеся к содержанию документа.
  • XML несет информацию только о структуре и смысле документа, оставляя форматирование элементов таблице стилей.
  • Одним из важных достоинств XML является его способность объединять несколько ХМL - документов в один большой документ.


  • История развития языков разметки.

    Понятие гипертекста было введено В.Бушем в 1945 году а, начиная с 60-х годов, стали появляться первые приложения, использующие гипертекстовые данные. Однако основное развитие данная технология получила, когда возникла реальная необходимость в механизме объединения множества информационных ресурсов, обеспечения возможности создания, просмотра нелинейного текста.
    В 1986 году ISO был утвержден универсальный стандартизированный язык разметки (Standardized Generalized Markup Language). Этот язык предназначен для создания других языков разметки, он определяет допустимый набор тэгов, их атрибуты и внутреннюю структуру документа. Таким образом имеется возможность создавать свои собственные тэги, связанные с содержанием документа. Таким образом становится, очевидно, что такие документы трудно интерпретировать без определения языка разметки, которое хранится в определении типа документа (DTD - Document Type Definition). В DTD сгруппированы все правила языка в стандарте SGML. Другими словами в DTD описывается связь тегов между собой и правила их применения. Причем для каждого класса документов определяется свой набор правил, описывающих грамматику соответствующего языка разметки. Таким образом, только при помощи DTD можно проверить правильность использования тегов а, следовательно, его нужно посылать вместе с SGML-документом или включать в документ.
    В то время кроме SGML существовали еще несколько конкурирующих между собой подобных языков, однако популярность - HTML, который является одним из его потомков - дала SGML неоспоримое преимущество перед своими собратьями.
    С помощью SGML можно описывать структурированные данные, организовывать информацию, содержащуюся в документах, представлять эту информацию в некотором стандартизованном формате. Но из-за своей сложности, SGML использовался, в основном, для описания синтаксиса других языков, и немногие приложения работали с SGML-документами напрямую. SGML обычно применяется лишь в крупных проектах, например, для создания единой системы документооборота крупной фирмы.

    Гораздо более простой и удобный, чем SGML, инструкции HTML, в первую очередь, предназначены для управления процессом вывода содержимого документа на экране. Язык HTML как способ разметки технических документов был создан Тимом Бернерсом-Ли (Tim Berners-Lee) в 1991 году специально для научного сообщества. Первоначально он был всего лишь одним из SGML-приложений.

    Не смотря на то, что единственное, что умеет HTML - классифицировать части документа и обеспечивать его правильное отображение в браузере, он является самым популярным языком разметки. Это связано с тем, что HTML достаточно легок для изучения. Все, что от вас требуется, - изучить команды HTML. DTD для HTML хранится в браузере. К тому же надо заметить, что HTML спроектирован для работы на самых разных платформах. Но у него есть ряд существенных ограничений:

  • HTML имеет фиксированный набор тэгов, и данный набор нельзя расширить или изменить;
  • теги языка HTML показывают только, как должны быть представлены данные, внешний вид документа. HTML не несет информации о значении содержания, заключенного в тэгах, структуре документа;


  • В 1996 общественной организацией World Wide Web Consortium (W3C) началась разработка XML (Extensible Markup Language) который стал золотой срединой между языками SGML и HTML. Язык XML позволяет разработчику создавать свои собственные теги, но в отличие от SGML он достаточно прост.

    На основе языка XML был создан язык разметки для беспроводных устройств WML. Данный язык позволяет описать пользовательский интерфейс на устройствах с ограниченными возможностями представления данных, например, мобильных телефонах.

    Все представленное множество языков разметки удобно для наглядности представить в виде следующего "генеалогического дерева" языков разметки:

    История развития языков разметки.

    Язык XML в качестве данных

    Разметка ХМL отражает содержание документа, его можно использовать как универсальный формат в любых приложениях. Таким образом, XML-файл может быть не только воспроизведен на браузере, но, поскольку XML интегрирован в ряд других приложений, с его помощью можно предоставить пользователю данные для их дальнейшей обработки. XML, как язык разметки документов, приобретает все большую популярность в качестве формата хранения различных материалов. Однако XML не всегда удобен для хранения больших групп записей, так как кроме всего прочего необходимо хранить и описание тегов. В данном случае обычно используют традиционную базу данных, а по мере необходимости преобразовывать ее содержимое в XML.

    Языки разметки. Введение в XML

    Язык разметки (markup languages) - это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Другими словами разметка показывает, какая часть документа является заголовком, какая подзаголовком, что следует считать именем автора и т. д. Разметка разделяется на стилистическую разметку, структурную и семантическую.

    Как появился XML

    Разработка XML началась в 1996 году. Консорциум World Wide Web (W3C) выделил средства группе экспертов по языку SGML, возглавляемой Джоном Боузэком (Jon Bosak) из компании Sun Microsystems, для создания подмножества языка SGML, которое могло бы быть принято Web-сообществом. В результате работы несущественные возможности SGML были удалены, в результате чего язык, разработанный таким образом, оказался значительно более доступным, чем оригинал. В 1998 году консорциум выпустил спецификацию XML версии 1.0. Она постоянно совершенствуется, последний вариант спецификации всегда находится по адресу http://www.w3c.org/TR/rec-xml.
    Необходимо отметить, что язык XML был разработан таким образом, что любой действительный документ XML является действительным документом SGML.

    Семантическая разметка

    Семантическая разметка информирует о содержании данных. Примера данного типа разметки являются теги (имя документа), (код, используется для листингов кода), (переменная),
    (адрес автора).
    Основными понятиями любого языка разметки являются теги, элементы и атрибуты.

    Стилистическая разметка

    Стилистическая разметка отвечает за внешний вид документа. Например, в HTML к данному типу разметки относятся такие теги как (курсив), (жирный), (подчеркивание), (перечеркнутый текст) и т.д.

    Структурная разметка

    Структурная разметка задает структуру документа. В HTML за данный тип разметки отвечают, например, теги
    (параграф), (заглавие),
    (секция) и т.д.

    Тэги и элементы.

    Значения понятий тэги и элементы часто путают.
    Тэги, или, как их еще называю, управляющие дескрипторы, служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента как поступить с содержимым тега. Для того чтобы выделить, тег, относительно основного содержимого документа используются угловые скобки: тег начинается со знака "меньше" (<) и завершается знаком "больше" (>), внутри которых помещаются название инструкций и их параметры. Например, в языке HTML тег указывает на то, что следующий за ним текст должен быть выведен курсивом.
    Элемент - это тэги в совокупности с их содержанием. Следующая конструкция является примером элемента:
    Это текст выделен курсивом .
    Элемент состоит из открывающего тега (в нашем примере это тег ), содержимого тега (в примере это текст "Это текст, выделен курсивом") и закрывающего тега(), правда иногда в HTML, закрывающий тег можно опустить.

    Взаимодействие с машиной

    Поскольку XML-файлы несут информацию о своем содержании, машинные пользовательские агенты способны обрабатывать информацию, помещенную в файл. Это означает, что в частном случае применения поисковых машин они обеспечивают значительно более точные результаты по запросам. В то время как HTML стал форматом представления, XML действует в качестве общепринятого синтаксиса, позволяя значительно большему числу машинных пользовательских агентов использовать хранимые в XML файлах данные для различных целей. Взаимодействие с машиной <

    Языки информационного обмена

    Анализаторы.

    Помимо определения синтаксиса XML, в рекомендации W3C описан так же процессор или анализатор XML. Существуют два типа анализаторов:
  • non-validating (не проверяющий на допустимость) - анализатор просто проверяет, чтобы объект данных был правильно оформленным документом XML
  • validating (проверяющий на допустимость) - с помощью определения DTD анализатор проверяет допустимость формы и содержания правильно оформленного документа XML

  • Некоторые анализаторы поддерживают оба типа, при этом в их конфигурации имеется возможность переключаться на один из них, в зависимости от того, надо ли проверять допустимость документа.

    Атрибут xml:lang

    Атрибут xml:lang используется для идентификации языка, который использовался при записи содержимого и значений атрибутов любого элемента. Данный атрибут пригодится в международных документах XML.
    Атрибут xml:lang как и все остальные атрибуты необходимо продекларировать в DTD. Данный атрибут может принимать значения определенные в документе IETF (Internet Engineering Task Force) RFC 1766: Тэги для идентификации языков, редактор H. Alvestrand. 1995. (http://www.ietf.org/rfc/rfc1766.txt.) или наследующих его стандартах IETF. Значение атрибута применяется не только к содержащему его элементу, но и ко всем его потомкам и атрибутам.
    Как и в случае xml: space, приложение вовсе не обязано реагировать на атрибут xml: lang.

    Атрибут xml:space

    С помощью атрибута xml:space можно указать приложению на необходимость сохранять пустые пространства. Впрочем, фактические действия приложения зависят от самого приложения - в рекомендациях XML по этому поводу нет никаких требований. Атрибут xml: space будет полезен при моделировании данных XML.
    Атрибут xml:space может принимать значения "preserve" и "default". Значение "preserve" предписывает сохранять пробельные символы в неприкосновенности. Значение "default" оставляет пробельные символы на усмотрение программы-обработчика.
    Значение атрибута применяется не только к содержащему его элементу, но и ко всем его потомкам.

    Атрибуты.

    Открывающие теги либо теги пустых элементов в XML могут содержать атрибуты, представляющие собой пару имя=значение. В одном открывающем теге разрешается использовать только один экземпляр имени атрибута. Атрибуты могут содержать ссылки на объекты, ссылки на символы, текстовые символы. В отличие от языка HTML, в XML значения атрибутов обязательно надо заключать в апострофы ('), либо в кавычки ("). Таким образом, атрибут может быть записан в одном из двух форматов:
    имя_атрибута="значение_атрибута" имя_атрибут='значение_атрибута'.
    Атрибуты используются, для того чтобы связать некоторую информацию с элементом, а не просто включить ее в содержание последнего. Однозначного ответа на вопрос что лучше выбрать элемент или атрибут не существует. Каждый выбирает то, что ему больше нравиться. Атрибуты удобно использовать для описания простых значений или для указания типа элемента. Например, мы можем ввести в открывающий тег атрибут type( который может принимать одно из значений: город, поселок, деревня) тогда данный тег может выглядеть следующим образом:
    Новосибирск
    Помимо атрибутов, которые можно определять самим, существуют еще два специальных атрибута, чьи роли в языке XML фиксированы. В рекомендациях XML 1.0 определены два специальных атрибута - xml:space и xml:lang.

    Древовидные анализаторы.

    Одной из самых распространенных структур в конструировании программного обеспечения является простое иерархическое дерево. Все правильно оформленные данные XML должны представлять собой такое дерево, и потому для путешествия по узлам документа, поиска его содержания и/или редактирования можно использовать распространенные хорошо разработанные алгоритмы. Эти алгоритмы в течение десятилетий разрабатывались и использовались в академической и коммерческой среде. Использующие этот подход анализаторы XML, как правило, соответствуют предложенной консорциумом W3C объектной модели документа (DOM).

    Имена.

    В языке XML все имена должны начинаться с буквы, символа нижнего подчеркивания (_) или двоеточия (:) и продолжаться только допустимыми для имен символами, а именно они могут содержать только буквы, входящие в секцию букв кодировки Unicode, арабские цифры, дефисы, знаки подчеркивания, точки и двоеточия. Однако имена не могут начинаться со строки xml в любом регистре. Имена, начинающиеся с этих символов, зарезервированы для использования консорциумом W3C. Нужно помнить что так как буквы не ограничены исключительно символами ASCII, то в именах можно использовать слова из родного языка.

    Инструкции по обработке.

    Инструкции по обработке содержат указания программе анализатору документа XML. Инструкции по обработке заключаются между символами . Сразу за начальным вопросительным знаком записывается имя программного модуля, которому предназначена инструкция. Затем, через пробел, идет сама инструкция, передаваемая программному модулю. Сама инструкция это обычная строка, которая не должна содержать набор символов "?>", означающий конец инструкции. Примером инструкции по обработке может служить строка объявления XML:

    Эта инструкция предназначена программе, обрабатывающей документ XML. Инструкция передает ей номер версии и кодировку, в которой записан документ.

    Элементы.

    Документ XML состоит из элементов. Элемент начинается открывающим тегом, затем идет необязательное содержимое элемента, после чего записывается закрывающий тег (в отличие от HTML наличие закрывающего тега обязательно, исключением являются элементы без содержания, так называемые пустые элементы, которые могут быть записаны в сокращенной форме). В качестве содержимого элемента могут выступать другие элементы, символьные данные, ссылки на символы, ссылки на сущности, комментарии, разделы CDATA, инструкции по обработке.

    Эпилог

    В эпилог XML могут входить комментарии, инструкции по обработке и/или пустое пространство.
    В языке XML не определен индикатор конца документа, большинство приложений для этой цели используют завершающий тег корневого элемента документа. Таким образом, встретив, завершающий тег корневого элемента, , скорее всего, приложение закончит обработку документа, и эпилог обработан не будет.

    Комментарии.

    Если надо вставить в текст документа комментарий либо сделать какой-то фрагмент "невидимым" для программы-анализатора, то его оформляют следующим образом:

    Комментарии могут появляться в любом месте документа вне другой разметки.
    Текст комментария это любая строка символов со следующими ограничениями:
  • в комментарии нельзя записывать два дефиса подряд;
  • комментарий нельзя завершить дефисом.


  • Открывающие теги.

    Открывающий тег начинается со знака "меньше" (<) и завершается знаком "больше" (>), внутри которых помещаются имя элемента:
    <имя_элемента>.

    Правильно оформленные и верные документы.

    Все объекты данных (документы), соответствующие спецификации XML, называются правильно оформленными (well-formed) документами. Правильно оформленный документ XML:
  • содержит один или несколько элементов (ограниченных открывающим и закрывающим тегами), правильно вложенными друг в друга;
  • существует только один корневой элемент, который содержит все остальные элементы документа.
  • все элементы образуют простое иерархическое дерево, так что единственным непосредственным отношением между элементами является отношение типа "родитель-потомок".

  • Любой анализатор XML, столкнувшись в данных XML с конструкцией, которая не является правильно оформленной, должен сообщить приложению об этой ошибке, после чего анализатор может продолжить обработку документа, пытаясь найти остальные ошибки, но он уже не будет передавать данный приложению.
    Концепция правильно оформленных документов позволяет использовать данные XML без необходимости конструировать внешние описания данных и ссылаться на них.
    Однако кроме проверки на формальное соответствие грамматике языка, в документе могут присутствовать средства контроля над содержанием документа: DTD - определения (Document Type Definition) и схемы данных (Semantic Schema). Прочитав формализованное описание и узнав из него схему документа, программа-анализатор может проверить соответствие каждого документа - его схеме и сделать вывод, верен этот документ или нет. Для того, чтобы обеспечить проверку корректности XML- документов, необходимо использовать анализаторы, производящие такую проверку.

    Пролог XML- документа.

    Документ XML начинается с пролога. В прологе содержатся некоторые указания, предназначенные для анализатора XML и приложений.
    Пролог состоит из нескольких частей:
  • необязательное объявление XML (XML Declaration) которое заключено между символами . Объявление содержит:
  • пометку xml и номер версии (version) спецификации XML;
  • указание на кодировку символов (encoding), в которой написан документ (по умолчанию encoding="UTF-8");
  • параметр standalone который может принимать значения "yes" или "no" (по умолчанию standalone="yes"). Значение "yes" показывает, что в документе содержатся все требуемые декларации элементов, a "no" - что нужны внешние определения DTD.

  • Все это вместе может выглядеть следующим образом:
    .
    Важно отметить, что в объявлении XML только атрибут version является обязательным, все остальные атрибуты могут быть опущены и, следовательно, принимать значения по умолчанию. Так же нужно помнить, что все эти атрибуты следует указывать только в приведенном выше порядке.
  • комментарии.
  • команды обработки.
  • символы пустых пространств.
  • необязательное объявление типа документа, DTD (Document Type Declaration) которое заключено между символами и может занимать несколько строк. В этой части объявляются теги, использованные в документе, или приводится ссылка на файл, в котором записаны такие объявления.

  • После объявление типа документа так же могут следовать комментарии, команды обработки и символы пустых пространств.
    Поскольку все эти части необязательны, пролог может быть опущен.

    Пространства имен XML

    Поскольку в разных XML-документах могут встретится одни и те же имена тегов и их атрибутов, имеющие совершенно разный смысл, надо иметь возможность их как-то различать. Для этого имена тегов и атрибутов снабжают кратким префиксом, который отделяется от имени двоеточием. Префикс имени связывается с идентификатором, определяющим пространство имен (namespace). Все имена тегов и атрибутов, префиксы которых связаны с одним и тем же идентификатором, образуют одно пространство имен, в котором имена должны быть уникальны. Префикс и идентификатор пространства имен определяются атрибутом xmlns следующим образом:

    В дальнейшем имена тегов и атрибутов, которые мы хотим отнести к пространству имен "http://URI_namespace", снабжаются префиксом ns, например:
    Новосибирск.
    Атрибут xmlns может появиться в любом элементе XML, а не только в корневом. Определенный им префикс можно применять в том элементе, в котором записан атрибут xmlns, и во всех вложенных в него элементах. Более того, в одном элементе можно определить несколько пространств имен. Во вложенных элементах пространство имен можно переопределить, связав префикс с другим идентификатором. Появление имени тега без префикса в документе, использующем пространство имен, означает, что имя принадлежит пространству имен по умолчанию. Префиксы, начинающиеся с символов xml с любым регистром букв, зарезервированы за самим языком XML.
    Имя вместе с префиксом называется расширенным или уточненным именем. Часть имени, записанная после двоеточия, называется локальной частью имени.
    Идентификатор пространства имен должен иметь форму URI. Адрес URI не имеет никакого значения и может не соответствовать никакому действительному адресу Интернета. В данном случае URI можно рассматривать как уникальную строку символов, идентифицирующую пространство имен.
    По правилам SGML и XML, двоеточие может применяться в именах как обычный символ, поэтому любая программа, "не знающая" пространства имен, анализируя документ, рассматривает уточненное имя как обычное уникальное имя. Отсюда следует, в частности, что в объявлении типа документа (Document Type Declaration) нельзя опускать префиксы имен.

    Пустые элементы.

    Если в содержимом элемента нет ни одного символа, даже пробела, то закрывающий тег можно не записывать. В этом случае открывающий тег должен заканчиваться символами "/> ".
    Таким образом, тег пустого элемента начинается со знака "меньше" (<) за которым следует имя элемента и завершается знаками "косая черта" (/) после которой идет знак "больше" (>):
    <имя_элемента/>.

    Пустые пространства.

    В языке XML пустым пространством считаются только четыре символа: горизонтальная табуляция (HT), перевод строки (LF), возврат каретки (CR), символ пробела ASCII. В стандарте Unicode также определено несколько других типов пустых пространств, но ни один из них не считается таковым в контексте разметки XML.
    Спецификация XML требует, чтобы анализатор передавал все символы, в том числе и символы пустых пространств в содержании элемента, приложению. Символы же пустых пространств в тегах элементов и значениях атрибутов могут быть удалены.

    Секция CDATA.

    Секция CDATA используется, для того чтобы задать область документа, которую при разборе анализатор будет рассматривать как простой текст, игнорируя любые инструкции и специальные символы. Программа-анализатор не разбивает секцию CDATA на элементы, а считает ее просто набором символов. В отличие от комментариев, содержание данной секции не игнорируется, а передается без изменений на выход программы анализатора, благодаря чему его можно использовать в приложении.
    Секция CDATA начинается со строки
    Секция CDATA может содержать любую символьную строку, кроме "]]>".
    Секции CDATA можно создать в содержимом любого элемента XML. На секцию налагаются следующие два ограничения:
  • внутри секции CDATA нельзя создать новую секцию,
  • секции CDATA нельзя вкладывать друг в друга.


  • Символьные данные.

    Символьные данные - это любой текст, являющийся содержанием элемента или значением атрибута. Если в содержимое элемента нужно вставить некоторые символы, которые используются в служебных целях, например знаки "больше" или "меньше" которые являются ограничителями разметки и могут быть поняты как начало или конец вложенного тега, то эти символы необходимо заменить ссылками или их числовыми кодами.

    Символы.

    Поскольку XML предназначен для широкого использования, символы не ограничены 7-битным набором символов ASCII. К числу символов, допустимых в языке XML, относятся три управляющих символа СО стандарта ASCII, все обычные символы этого стандарта и почти все остальные символы Unicode

    Синтаксис разметки.

    Для ограничения тегов в разметке XML, так же как и в HTML используются угловые скобки: тег начинается со знака "меньше" (<) и завершается знаком "больше" (>). Но необходимо помнить, что в отличие от HTML вся разметка XML чувствительна к регистру символов, это касается как имен тегов, так и значений атрибутов.

    Событийно управляемые анализаторы.

    Один из подходов в обработке данных XML связан с событийно управляемыми анализаторами. В этом случае анализатор осуществляет обратное обращение (call-back) к приложению для каждого класса данных XML: элементы (с атрибутами), символьные данные, команды обработки, нотации или комментарии. Приложение осуществляет всю дальнейшую обработку данных XML, полученных в результате обратных обращений, - анализатор не обслуживает древовидную структуру элемента или любые анализируемые данные. Даже для чрезвычайно больших документов анализатор XML расходует очень небольшое количество системных ресурсов; кроме того, вследствие его простого низкоуровневого доступа к данным XML, он позволяет чрезвычайно гибко работать с данными в приложении XML.

    Средства тестирования анализаторов.

    Два разработчика недавно создали набор тестов для анализаторов XML (XML parser benchmark tests), применив их затем к различным анализаторам в системах Linux и Solaris. Результаты этих тестов показывают, что наиболее быстрыми являются анализаторы, написанные на языке С, за ними следуют те, что написаны на языке Java, а затем - на языках сценариев (Perl и Python). Средства тестирования анализаторов. <

    Ссылки на символы.

    Для того что бы вставить в текст документа некоторый символ, который, например, не присутствует в раскладке клавиатуры либо может быть неправильно истолкован анализатором, используют ссылки на символы. Ссылка на символ обязательно начинается со знака "амперсанда" и заканчивается точкой с запятой.
    Ссылки на символы записываются в следующем виде:
    &#код_символа_в_Unicode;.
    Код символа можно записать и в шестнадцатеричном виде. В этом случае перед ним ставится символ "x":
    &#xШестнадцатеричный_код_символа;.
    Кроме этого существуют именованные подстановки, определенные в спецификации XML, и реализованные во всех совместимых с XML анализаторах, которые делают текст документа более понятным для человека. С помощью этих именованных подстановок можно вставить в текст документа такие символы как:
    СимволыИменованные подстановки
    &&
    <<
    >>
    ''
    ""


    Ссылки на сущности.

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

    Структура XML- документа.

    Любой XML-документ состоит из следующий частей:
  • Необязательный пролог.
  • Тело документа.
  • Необязательный эпилог, следующего за деревом элементов.

  • Рассмотрим каждую из частей более подробно.

    Тело XML-документа.

    Тело документа, состоит из одного или больше элементов. В правильно оформленном XML документе элементы формируют простое иерархическое дерево, в котором обязательно присутствует корневой элемент (root element) в который вложены все остальные элементы документа. Язык XML налагает на элементы чрезвычайно важное ограничение - они должны быть правильно вложены. Это позволяет достаточно легко вложить один XML- документ в другой не нарушаю структуру документа, при этом корневой элемент вложенного документа станет просто одним из элементов документа, в который он вложен. В связи с этим мы сталкиваемся с еще одним ограничением, а именно с тем, что имена элементов должны быть уникальны в пределах документа, поскольку во включенном документе такие же имена, что и во включающем могут иметь совершенно иной смысл. Для решения проблемы совпадающих имен введено понятие пространства имен.
    Имя корневого элемента считается именем всего документа и указывается во второй части пролога после слова Doctype. Если определение DTD находиться внутри XML- документа, то оно помещается в квадратных скобках после имени корневого элемента:

    Но обычно определение DTD составляется сразу для нескольких XML -документов. В таком случае его удобно записать отдельно от документа и тогда вместо квадратных скобок записывается одно из слов System или Public после которого идет адрес в форме URI (Uniform Resource Identifier) файла с определением DTD. Для всех практических целей URI считается эквивалентом адреса URL, хотя в принципе это может быть любое уникальное имя. Определение DTD, например, может выглядеть следующим образом:


    Закрывающие теги.

    Закрывающий тег начинается со знака "меньше" (<) за которым следует "косая черта" (/) после которой повторяется имя элемента из соответствующего открывающего тега и завершается знаком "больше" (>):
    .
    При этом необходимо помнить, что каждый закрывающий тег должен соответствовать своему открывающему тегу, а так же что вложенность тэгов в XML строго контролируется, поэтому необходимо следить за порядком следования открывающих и закрывающих тэгов.
    Таким образом, полностью элемент выглядит следующим образом:
    <имя_элемента> содержание элемента

    Языки информационного обмена

    Ассоциирование DTD с документом XML

    Для связывания декларации DTD с экземпляром документа в версии XML 1.0 предлагается специальная декларация DOCTYPE. Она должна следовать после декларации XML и предшествовать любым элементам документа. Тем не менее, между декларациями XML и DOCTYPE могут находиться комментарии и команды обработки.
    Декларация DOCTYPE содержит ключевое слово DOCTYPE, за которым следует имя корневого элемента документа, а затем конструкция с декларациями содержания. Перед разъяснением этого утверждения рассмотрим пример расположения декларации DOCTYPE в экземпляре документа. Ниже приводятся первые три строчки документа XML:
    ..
    Можно написать внешнее подмножество деклараций в отдельном файле DTD, включить внутреннее подмножество в тело декларации DOCTYPE или сделать то и другое. В последнем случае (смешение внутренних и внешних DTD) во внутренних DTD могут быть заданы новые декларации или переписаны те, что содержатся во внешних (по определению спецификации XML анализаторы сначала читают внутреннее подмножество, и потому содержащиеся там декларации пользуются приоритетом).
    Декларации XML могут содержать атрибут standalone, принимающий только значения "yes" и "nо". Если значение атрибута равно yes, то внешние для экземпляра документа декларации не влияют на информацию, передаваемую документом использующему его приложению. Значение no показывает, что существуют внешние декларации со значениями, необходимыми для правильного описания содержания документа - например конкретные значения по умолчанию. На практике необязательный атрибут standalone используется редко. Наличие этого атрибута со значением, yes не гарантирует отсутствия внешних зависимостей любого типа. Просто внешние зависимости в этом случае не приведут к ошибке в документе, если не будут включены в обработку. Таким образом, в основном этот атрибут представляет собой знак для анализаторов и других приложений, показывающий, нужно ли им использовать какое-либо внешнее содержание.

    Блок внутренней декларации разметки тега DOCTYPE состоит из левой квадратной скобки, списка деклараций и правой квадратной скобки:



    Внутренние DTD очень полезны, они всегда содержатся в использующем их документе и поэтому их получение анализатором не представляет проблем. Однако внутренние DTD значительно увеличивают размер документа. На практике внутренние DTD чаще всего применяются одновременно с внешними для добавления новых декларации. Если там объявлен какой-либо объект, продекларированный также и во внешнем определении DTD, приоритетом пользуется внутреннее. Это позволяет осуществлять тонкую настройку деклараций для нужд конкретных документов.

    Внешние DTD в некоторых отношениях более гибкие. В данном случае декларация DOCTYPE состоит из обычного ключевого слова и имени корневого элемента, за которым следует еще одно ключевое слово SYSTEM либо PUBLIC, обозначающее источник внешнего определения DTD, а за ним - локализация этого определения. Если ключевое слово SYSTEM, DTD обязано непосредственно и явным образом находиться по указанному URL адресу.

    Если внешние DTD переписываются очень часто, они начинают терять свое значение, а это признак плохого первоначального проекта.

    Ключевого слова PUBLIC предназначено для хорошо известных словарей. Приложение, анализирующее документ из этого словаря, должно использовать некоторую стратегию по поиску соответствующего DTD.

    Стандарт XML 1.0 допускает у декларации PUBLIC наличие как публичного URI, так и системного идентификатора. Если работающее с документом приложение или анализатор не могут найти DTD по идентификатору URI с ключевым словом PUBLIC, оно должно использовать системный идентификатор.

    Недостатки и особенности определений DTD.

    Описание структуры документа XML, выполненное средствами DTD имеет ряд недостатков и ограничений:
  • Синтаксис DTD отличается от синтаксиса XML. XML документ не может обработать проверяющий на допустимость анализатор XML, но он не обязан предоставлять связанный с этим документом DTD вызвавшему его приложению. К тому же, если мы хотим из приложения обрабатывать определения DTD, нам потребуется отдельный механизм анализа.
  • Определения DTD представляют собой закрытые конструкции. Вся информация должна быть включена только в одно определение DTD. Это не кажется ограничением, пока нет необходимости позаимствовать декларацию или какую-либо иную полезную конструкцию из другого определения DTD.
  • Сегментация недопустима, если не считать ситуаций, когда определение DTD можно логически сконструировать таким образом, чтобы оно включало вложенные определения DTD.
  • В DTD практически отсутствует информация о типах данных, точном количестве повторений вложенного элемента и некоторые другие необходимые подробности.

  • Недостатки и особенности определений DTD. <

    Объявление атрибутов.

    Атрибуты элемента объявляются после объявления самого элемента. Все атрибуты одного элемента объявляются сразу, одним списком. Список начинается с символов Тип атрибута записывается одним из ключевых слов:
  • CDATA - строка символов.
  • ID - уникальный идентификатор, однозначно определяющий элемент, в котором встретился этот атрибут; значения такого атрибута не должны повторяться в документе. Они играют ту же роль, что и первичные ключи в таблицах баз данных.
  • IDREF - идентификатор, содержащий одно из значений атрибутов типа id, используется в качестве ссылки на другие элементы.
  • IDREFS - идентификатор, содержащий набор значений атрибутов типа id, перечисленных через пробелы; тоже используется в качестве ссылки сразу на несколько элементов.
  • ENTITY - имя непроверяемой анализатором сущности объявленных в этом же описании DTD.
  • ENTITIES - имена непроверяемых сущностей.
  • NMTOKEN - слово, содержащее только символы, применяемые в именах. Атрибуты этого типа могут содержать имена других элементов или атрибутов, например, для того чтобы ссылаться на них.
  • NMTOKENS - слова, перечисленные через пробелы.
  • NOTATION - обозначение расшифрованное в описании DTD.

  • Признак обязательности записывается с использование ключевых слов:
  • #REQUIRED - атрибут надо обязательно записывать в элементе;
  • #IMPLIED - атрибут необязателен, у него нет значения по умолчанию;
  • #FIXED - у атрибута есть только одно значение, которое записывается тут же, через пробел.
  • Пример:

    Объявление инструкций по обработке.

    Объявление инструкций по обработке начинается с символов Пример.
    Это объявление связывает обозначение image-gif с программой обработки изображений, находящейся в файле viewer.exe.

    Объявление элементов.

    Каждый элемент документа XML должен быть описан. Объявление элемента начинается с символов
  • Пустой элемент - может иметь атрибуты, но не содержит текст или порожденные элементы. Объявляется следующим образом: после имени элемента указывается ключевое слово EMPTY. Пример:
  • Элемент содержит только порожденные элементы, но не текст. Объявляется следующим образом: после имени элемента в скобках через запятую перечисляются все вложенные элементы. Причем вложенные элементы должны следовать в XML документе в том порядке, в каком они перечислены в объявлении. Пример:
  • Элемент содержит не только порожденные элементы, но и текст. Объявляется следующим образом: после имени элемента в скобках указывается ключевое слово #PCDATA, после которого через запятую, как и в предыдущем случае, перечисляются все вложенные элементы (если они имеются). Пример:
  • Элемент, открытый для любого содержания. Объявляется следующим образом: после имени элемента указывается ключевое слово ANY. Пример:

  • Иногда из нескольких вложенных элементов или списков (список элементов указанных в скобках) может встретиться только один. В таком случае их имена перечисляются через вертикальную черту( | ). Например:
    - элемент element_name должен содержать элемент elem_1, а затем либо elem_2, либо elem_3.
    Элементы появляются именно в таком порядке.
    Если вложенный элемент можно записать в объявляемом элементе несколько раз, то необходимо это указать используя звездочку, плюс или вопросительным знак.
    ? - элемент или список может встретиться нуль или один раз;
    * - элемент или список может встретиться нуль или несколько раз;
    + - элемент или список может встретиться один или несколько раз.

    Объявление сущности.

    Ссылки на сущности используются как краткие обозначения для громоздких или часто повторяющихся фрагментов документа XML. Сами сущности подставляемые в документ вместо ссылок, объявляются в описании DTD.
    Все сущности можно разделить на три группы:
  • внутренние сущности - задаются при объявлении сущности. Объявление начинается с символов
    После такого объявления программа-анализатор, увидев в документе ссылку на сущность ⟨, заменить ее на строку XML. Ссылку на сущность можно применять тут же, в описании DTD, уже в следующем объявлении.
  • внешние сущности - содержатся в отдельных файлах или встроены в программу-анализатор. Для них указывается одно из слов SYSTEM или PUBLIC после которого записывается место их расположения. После ключевого слова SYSTEM указывается URI адрес. После слова PUBLIC идет какое-то общеизвестное объявление, после которого через пробел также указывается URI адрес, которым программа-анализатор воспользуется, если не поймет указанного объявления.
  • параметризованные сущности - используются только внутри описания DTD. Объявление начинается с символов
    Ссылка на параметризованную сущность начинается не с амперсанда, а со знака процента, в примере- %lang;. Введение этой ссылки удобно тем, что при смене языка надо будет поменять значение ru _Ru только в одном месте описания.


  • Основные декларации разметки

    Допустимое в документе XML содержание определяется с помощью четырех типов декларации разметки в DTD. В следующей далее таблице показаны связанные с этими декларациями ключевые слова и их значения:
    Конструкция DTDЗначение
    ELEMENTДекларация типа элемента XML
    ATTLISTДекларация атрибутов, которые могут быть назначены конкретным типам элементов, а также разрешенных значений этих атрибутов
    ENTITYДекларация повторно используемого содержания
    NOTATIONДекларация форматирования для внешнего содержания, которое не должно быть проанализировано (например, двоичные данные), а также для внешних приложений, обрабатывающих содержание

    Первые два типа связаны с информацией, которую мы рассчитываем найти в документе XML, - элементами и атрибутами.
    Последние два типа используются для поддержки. Особенно облегчают жизнь разработчика словаря XML сущности. Как правило, они состоят из содержания, которое настолько часто используется в DTD или документе, что оправдывает создание специальной декларации. Применение этой декларации напоминает оператор include в языках C/C++, когда в качестве замены для содержания используется имя.
    Нотации описывают содержание, разработанное не на языке XML. Используются они для того, чтобы объявить конкретный класс данных и связать его с внешней программой. Эта внешняя программа становится обработчиком объявленного класса данных. Например, связав с документом изображение в формате JPEG, разработчик желает, чтобы программа приняла и визуализировала двоичные данные в этом формате. Конечно, в таком случае документ зависит от того, какой обработчик имеется в системе, получающей документ. В интересах портативности и переносимости некоторые авторы не приводят ссылки на обработчики. В таком случае нотация превращается просто в механизм набора текста.

    Зачем нужно DTD.

    Создавая XML документ разработчик сам решает: как назвать теги, в каком порядке они будут следовать, какие данные будут записаны в том или ином элементе, будут ли у элемента атрибуты или нет и многое другое. Без формального описания структуры документа этим самым документом может воспользоваться только его разработчик. В случае если разработанный XML документ предназначен для передачи во внешний мир, например партнерам по бизнесу, и если к тому же планируется получать в ответ документы, написанные в том же самом формате без определения типов документов (Document Type Definition, DTD) не обойтись. Это связано с тем, что для того, что бы обе стороны могли понимать полученную информацию элементы и атрибуты в документах должны употребляться всеми сторонами одинаково. Определения типа документа вносят строгость и точность в правила написания правильно оформленных документов XML. Хранимые в начале файла XML или внешним образом в виде файла *.DTD, определения типов документов описывают информационную структуру документа. В DTD перечисляются возможные имена элементов, определяются имеющиеся атрибуты для каждого типа элементов и описывается вложенность элементов.
    XML используется в качестве средства для описания грамматики других языков. И таким образом разрабатывая некоторый язык для написания XML документов в той или иной области нам придется разработать словарь данной области деятельности. DTD по определению содержат всю информацию которая может появиться в XML документе. Все, что входит в проект, должно быть включено в DTD. Таким образом DTD описания в сущности и является таким словарем. Современный мир меняется достаточно динамично поэтому заранее не известно какая информация может потребоваться в дальнейшем и для того что бы не пришлось часто изменять структуру документов обычно разрабатываемый словарь включает в себя все что может понадобиться для конкретных видов бизнеса или промышленности. Это позволяет использовать определения DTD как средство анализа и проектирования. Приложения XML взаимодействуют друг с другом на основе словарей, которые они понимают, так что определение DTD помогает понять, что может описать приложение.
    Другое применение DTD это проверка написанного XML документа на корректность. Правильно оформленные документы, написанные в соответствии со всеми правилами, описанными в спецификации XML, не могут быть проверены на предмет ошибок. Пропущенные ошибки могут вызвать повреждение программы обрабатывающей данные документы, либо ввод в систему неверных данных. Но если документ ссылается на определение DTD, то, используя проверяющей на допустимость анализатор можно проверить, есть ли в нашем документе ошибки. Анализатор затребует DTD и убедиться, что документ соответствует описанным в нем грамматическим правилам. Анализатор обнаруживает структурные ошибки и ошибки содержания, что намного уменьшает объем проверок, выполняемых логикой приложения.

    Языки информационного обмена

    Диаграммы взаимодействия объектов

    Диаграммы взаимодействия объектов позволяют проанализировать обмен сообщениями между объектами на более тонком уровне детализации, чем модель потока данных.
    Диаграммы взаимодействия объектов неоценимы, если требуется описать взаимодействие между различными системами. Они позволяют определить, какая информация содержится в каком сообщении. Поскольку эти сообщение написаны на языке XML, диаграммы взаимодействия объектов дают нам контекст, требуемый для начала проектирования структуры XML каждого индивидуального сообщения.

    Динамическая информационная модель

    Динамические модели описывают, что происходит с информацией: примерами таких моделей являются диаграммы рабочих процессов, потоков данных и жизненных циклов объектов. Динамические модели состоят примерно из таких утверждений: "Отделение патологии отправит результаты теста консультанту, отвечающему за пациента". Динамические модели описывают процесс обмена информацией: данные отправляются из одного места в другое с конкретной целью.
    Для построения динамической модели можно воспользоваться различными программными системами (например, диаграммы рабочих процессов и диаграммы потоков данных можно построить, воспользовавшись программой BPWin).
    Существует несколько подходов к динамическому моделированию:
  • Модели рабочих процессов
  • Модели потоков данных
  • Объектные модели
  • Жизненные циклы объектов
  • Варианты использования
  • Диаграммы взаимодействия объектов


  • Документы и данные

    Традиционно документы и данные относились к различным областям. Работа с коммерческими данными была связана с высоко структурированной и формализованной информацией. Публикация документа, напротив, представляет собой организацию процесса создания и выпуска текста, который может быть прочитан людьми.
    Таким образом, с одной стороны, основные усилия в мире данных были связаны с автоматизацией, анализом, кодированием и унификацией систем; с другой стороны, в документах главное - обеспечить гибкость, позволяющую авторам информации общаться со своими читателями по возможности творчески.
    Сеть Web объединила эти миры. Язык XML стал первым примером технологии, одинаково применимой в обоих случаях.
    Традиционный подход, касающийся как обработки данных, так и проектирования документов, предполагает начать с уже имеющейся документации на бумаге. Найдите документы, адекватные стоящей перед вами задаче, определите их структуру с помощью процессов обобщения и абстракции, побеседуйте с пользователями, узнайте, откуда приходит информация в документы, как она передается от одного документа другому и как используется, а затем на основе всего этого составьте модель данных.
    В наши дни этот подход бывает, неприемлем, поскольку люди не хотят создавать системы, просто репродуцирующие существующий способ работы. Необходимо знать не только, какая информация должна быть получена, но и почему необходима именно она.

    Использование языка XML для хранения постоянной информации

    Проекты сообщений определяются в основном динамическими информационными моделями. Но при использовании языка XML для хранения постоянной информации особенно важны статические модели.
    При использовании языка XML для хранения постоянной информации встает вопрос о размере одного XML документа. Существуют приложения, в которых имеет смысл поддерживать один документ XML, содержащий гигабайты информации, но это скорее исключения, чем правила. Язык XML не совсем подходит для организации прямого доступа к документу; чтобы обратиться к любой части такого большого документа с помощью современной технологии, его придется анализировать целиком, а это потребует много времени. С другой стороны, противоположная крайность также не является идеальным решением, поскольку наличие большого количества крошечных документов делает невозможным использование богатой структуры XML для представления связей в информационной модели.
    Иногда существует естественное отображение одного документа XML на один бизнес-объект (в случае, если последние имеют значительный размер и внутреннюю сложность). Если документы XML используются для постоянного хранения данных, процесс поиска этих данных всегда состоит из двух этапов: сначала надо найти правильный документ, а затем в нем найти интересующие сведения. Для решения этих двух задач используются разные инструменты и методы, поэтому огромное значение имеет определение того, какую информацию поместить в каждый документ.
    Основным методом определения правильного размера документа считается концепция "содержимого страницы экрана". Конечно, принимать ключевое решение по проекту на основе того, сколько информации мы хотим передать пользователю за раз, кажется неразумным. Однако на практике это оказывается хорошим тестом. Если сохраняемый документ XML содержит значительно больше информации, чем пользователь когда-либо захочет увидеть на экране, то придется анализировать много данных, на которые он никогда не взглянет; если же для заполнения одного экрана информацией нужно обратиться к сотням сохраняемых документов XML, это вызовет существенную дополнительную нагрузку.
    Что делать, если пользователь хочет каждый раз видеть новый небольшой фрагмент информации? Одно из решений: сохранить весь документ DOM в памяти на сервере в области действия приложения. В ответ на запросы пользователей можно фильтровать его и создавать меньшие по размеру документы XML, более точно отвечающие его потребностям. Этот меньший документ можно затем направить клиенту для обработки.

    Использование языка XML для сообщений

    Использование языка XML для работы с сообщениями системы представляет меньше связанных с проектированием проблем, чем использование его для постоянных данных. Это связано с тем, что каждое сообщение обычно бывает сравнительно автономным, и вопрос о том, что в него включить, естественным образом выпадает из модели обработки.
    Разумеется, термин "сообщение" мы используем в широком смысле. Эти сообщения могут быть составлены в стиле электронного обмена данными. Или это могут быть данные, которыми обмениваются подсистемы в форме сообщения XML. Кроме того, сообщение может быть предназначено для отображения на экране. В таком случае, ответ на запрос вернется из базы данных в виде сообщения XML, но клиентская система (или браузер) преобразует его в видимую страницу с помощью соответствующей таблицы стилей.
    Существуют некоторые общие принципы проектирования, применимые ко всем сообщениям XML, независимо от их роли:
  • Проект сообщения должен отражать содержание информации, а не предполагаемое ее использование.
  • Проект должен поддерживать будущие изменения. Составление проекта на языке XML позволяет избежать таких традиционных подводных камней, как фиксированная ширина полей или фиксированный порядок столбцов. Однако проектировщик документа также отвечает за разработку такой структурной информации, которая могла бы предугадать будущие изменения.
  • Для сообщений лучше использовать стандартный тип (если он имеется), а не выдумывать новый. В настоящее время доступно большое количество стандартизированных сообщений, например созданных в рамках инициативы BizTalk.
  • Кодирование данных должно быть настолько близко к принятым кодировкам, насколько это возможно в рамках существующих ограничений производительности. Не стоит создавать идентификаторы, формирующие внутренние зависимости между сообщением и имеющейся базой данных. Сообщения должны быть автономными.

  • Надо ли включать ненужную в настоящий момент информацию, которая может потребоваться в дальнейшем? На этот вопрос нет универсального ответа.
    С одной стороны, легче включить все свойства проекта, а не выбирать те, в которых заинтересован реципиент. Затем можно передать все эти свойства получателю и дать ему возможность проигнорировать ненужные. С другой стороны, глупо посылать лишние данные, учитывая еще проблемы безопасности или секретности. Принимаемое решение должно диктоваться прагматическими соображениями.

    Имеет смысл включить в сообщение некоторую официальную информацию, даже если она дублирует доступную из других систем передачи сообщений. Очевидно, это дата и время, личность отправителя и получателя; с помощью серийного номера можно проконтролировать, что сообщение не было утеряно при передаче или отправлено дважды. Для включения всего этого в сообщения XML существуют две причины: реципиенту проще прочитать информацию из сообщения, а не извлекать ее откуда-то еще с помощью специального интерфейса API; и что более важно при архивировании сообщений для последующего аудита, - всю информацию легче сохранять в одном месте.

    Этап 1. Именование понятий

    Для начала нужно составить список понятий, относящихся к системе. Иногда предлагают даже описать систему на бумаге и выделить все существительные. В любом случае этот этап, как правило, не представляет затруднений.
    Далее, и это иногда требует больше времени, надо описать типы объектов. Описание термина должно быть точным, чтобы не возникало разногласий по существу определения. Ценность моделирования в том и заключается, что оно предотвращает появление потенциальных источников непонимания.
    По завершении работы, вероятно, получится длинный список типов объектов, и у некоторых будут длинные имена. Следует выбирать такие имена, которые занятые в этом бизнесе люди смогут корректно понять и интерпретировать: дело в том, что они не всегда будут сверяться с написанными определениями.
    Помимо именования типов объектов стоит определить также, каким образом можно идентифицировать индивидуальные экземпляры. Возможно, в этом виде бизнеса существует код, который следует знать, или написать его. Надо принимать во внимание, что в схемах кодирования в бизнесе часто обнаруживаются проблемы.
    В конце этого этапа мы получим список типов объектов с именами и определениями, по поводу которых достигнуто соглашение.

    Этап 2: Таксономия

    Таксономия - это термин, используемый в биологии для обозначения системы классификации; в информационном моделировании ее также называют иерархией типов (иногда ее называют еще онтологией). Перечислив и назвав типы объектов, их надо организовать в иерархическую схему классификации. Часто эти иерархические отношения возникают уже на этапе определения типов объектов.
    Ключевой здесь является фраза, определяющая принадлежность (в английском языке - is или is kind of). Написав предложение вида "А есть разновидность В" или "Каждое А есть В", вы определили отношения подтипов в вашей таксономии.
    Иногда эти действия называются тестом "is а" ("есть", "представляет собой"). Однако будьте внимательны, поскольку эта конструкция используется также и для описания отношений между конкретным экземпляром и его типом, безопаснее писать этот тест в форме "is a kind of" ("представляет собой разновидность").
    Идентификация подтипов бывает, полезна при проектировании документа, что более важно, она помогает лучше понять определения типов объектов.
    Если вы занимались объектно-ориентированным программированием, то понимаете, как определять иерархии типов. Но программисты часто рассматривают классы объектов, прежде всего в терминах модулей функциональности внутри системы, а не понятий, которые они представляют в окружающем мире. Тогда для обозначения типов объектов используются глаголы, а не существительные - что неверно.
    Итак, этап 2 сводится к организации типов объектов в иерархию типов.

    Этап 3: Поиск связей

    После того как объекты названы, в статическом информационном моделировании надо определить связи, существующие между ними. Связи (на языке UML они называются ассоциациями) можно показать просто сформулировав их в виде обычных предложений или их можно показать графически в виде диаграммы. Для диаграмм, описывающих связи между объектами, существует большое количество нотаций, каждый может выбрать более предпочтительную для себя. Диаграммы следует делать предельно простыми и интуитивно понятными, сосредоточившись на ключевых сообщениях и оставив подробности текстовым документам, которые проще обслуживать.
    Существует некая информация, которую надо знать о каждой связи:
  • Множественность связи показывает сколько объектов каждого типа может принимать в ней участие.
  • Связи типа "один-ко-многим": одна глава содержит много параграфов, один человек покупает много туристических поездок.
  • Связи типа "многие-ко-многим" также часто встречаются: один автор может написать несколько книг, но у книги также может быть несколько авторов.
  • Связи типа "один-к-одному".

  • При моделировании информации для окончательного представления XML особенно важным типом связей являются связи включения. Множественность этих связей всегда бывает "один-ко-многим" и "один-к-одному". Хотя четкого правила по поводу того, какие объекты образуют связи включения, не существует, можно иногда использовать правила обычного языка: глава содержит параграфы, курорт содержит отели, а отель содержит посетителей. В языке UML определено две формы связей включения. Первая - это агрегации, относительно свободное объединение объектов, позволяющее рассматривать их группу в течение некоторого времени как целое (например, туристическая группа, одни и те же люди могут в разное время входить в разные группы). Вторая форма - композиция. Это более строгая форма; отдельные части целого не могут существовать независимо от него (например, комнаты в отеле не могут существовать независимо от отеля).

  • Найти подходящие имена для связей иногда бывает нелегко. При записи связей полезно использовать полные фразы типа "отель расположен на курорте" или "человек - это автор книги". Нам не надо использовать эти имена в тегах разметки XML, они присутствуют только в документации на систему.
    Итак, в конце этапа 3 мы определили связи существующие между типами объектов в нашей модели.

    Этап 4. Описание свойств

    Типы объектов и связи формируют скелет статической информационной модели; свойства можно сравнить с плотью на костях. Свойства представляют собой простые значения, ассоциированные с объектами. У человека можно определить рост, вес, национальность и род занятий; отель имеет определенное количество комнат, этажность и ценовую категорию.
    Не следует снова включать связи в список свойств объекта: расположение отеля не является его свойством, если мы уже промоделировали его как связь с курортом.
    Главное, что нам надо знать о свойствах, - это тип их данных. Определен ли для них фиксированный диапазон значений, являются ли они числовыми, в каких единицах выражаются? Является ли свойство обязательным и есть ли у него значение по умолчанию?
    В конце этапа 4 мы завершили формирование статической информационной модели: получили полное описание типов объектов в системе, их связей друг с другом и их свойств.

    Модели потоков данных

    Модели потоков данных очень напоминают предыдущий тип, но здесь основное внимание уделяется информационным, а не бизнес-систем. Эта модель описывает хранилища данных (data stores), где информация находится постоянно (это может быть база данных в компьютере или просто кабинет с папками), процессоры, манипулирующие с этими данными, и потоки данных, передающие данные от одного процессора другому. Она активно использует статическую информационную модель: последняя описывает, что означают такие концепции, как путешественник или отель, но ничего не сообщает о том, где содержится информация. Напротив, из модели потоков данных становится ясно, что информация о туристической поездке находится в базе данных покупок до завершения поездки и оплаты всех счетов, после чего резюме этой информации передается в маркетинговую информационную систему, а все остальное - в архив.

    Модели рабочих процессов

    Модели рабочих процессов заостряют внимание на роли людей и организаций в выполнении работы, хранение и обработка информации играют в них вторичную роль. Модель процесса описывает, например, что будет с путешественником, если на отдыхе с ним произойдет несчастный случай. Она определяет, за какие действия отвечает локальный представитель на курорте, агент в стране, где находи курорт и главный офис. В результате становится ясно, кто должен отвечать за организацию медицинской помощи, за перевозку туриста домой и за информирование родственников. Она может описывать различные формы, заполняемые и пересылаемые между участниками, и вообще не привлекать компьютерные системы. Модель процесса обычно фокусирует внимание на ролях, обязанностях и задачах каждого действующего лица системы (actor), а workflow-модель имеет дело с документами, передаваемыми между действующими лицами.

    Моделирование данных и XML

    Успех любого приложения XML зависит от того, насколько хорошо спроектированы фактически используемые документы XML: они должны быть способны не только нести информацию, которую люди передают друг другу сегодня, но и обладать достаточной гибкостью, чтобы учитывать будущие требования. Для этого необходимо рассмотреть следующие аспекты процесса проектирования:
  • Моделирование информации (понимание структуры и назначения информации, содержащейся в документах);
  • Проектирование документа (трансляция информационной модели в набор правил или схем для создания фактических документов);
  • Нотации схем (методы записи проекта документа, чтобы он был доступен как для обрабатывающего его программного обеспечения, так и для пользователя-человека).


  • Моделирование информации

    Информационная модель - это описание используемой организацией информации, не зависящее от какой бы то ни было информационной технологии.
  • Каким образом она структурирована?
  • Что она означает?
  • Кому она принадлежит, и кто отвечает за ее своевременность и качество?
  • Откуда она берется и что происходит с ней в конце?

  • Моделирование информации имеет такое значение, потому что без модели нет информации, есть только данные. Информационная модель описывает назначение данных.
    Любое информационное моделирование преследует две цели, которые не всегда бывает легко сочетать:
  • Получение абсолютно точных определений
  • Эффективная коммуникация с пользователями

  • Существуют два основных типа информационной модели: статическая и динамическая.
    В статической модели описываются допустимые состояния системы. В статических моделях описываются типы объектов в системе, их свойства и связи. Описывая объекты, они определяют, разумеется, и их имена. Достичь соглашения по именованию всех объектов означает выиграть половину битвы, именно поэтому информационные модели XML иногда называют словарями.
    Динамические модели описывают, что происходит с информацией: примерами таких моделей являются диаграммы рабочих процессов, потоков данных и жизненных циклов объектов. Динамические модели состоят примерно из таких утверждений: "Отделение патологии отправит результаты теста консультанту, отвечающему за пациента". Динамические модели описывают процесс обмена информацией: данные отправляются из одного места в другое с конкретной целью.
    Статические модели особенно важны при проектировании базы данных, информация в которой сохраняется в течение долгого времени и используется по самым разным назначениям; в то же время динамические модели лучше подходят для проектирования сообщений, существующих только временно и предназначенных для конкретных целей.
    Язык XML, разумеется, может использоваться для представления в системе данных обоих типов - документов и сообщений. Тем не менее, в любом проекте системы необходимо рассмотреть как статические, так и динамические модели, причем оба типа моделей одинаково важны. Лучше начинать работу со статической модели. Отчасти это связано с тем, что именно в ней определяется базовая терминология, а еще с тем, что модели статической информации являются наиболее долговечными аспектами любой информационной системы.
    На практике, конечно, граница между долговечной статической информацией и временными сообщениями часто бывает размытой: объекты из статической информационной модели представляют собой события (например, продажа продукта), а документы, которые начинаются как временные сообщения (например, жалобы покупателя), затем архивируются на длительное время. Моделировать такие объекты как статические или как динамические, зависит от личного выбора и обстоятельств.

    Объектные модели

    Объектные модели содержат как динамический, так и статический компоненты. Динамическая или поведенческая часть определения объекта сосредоточена на том, что может делать или делал каждый объект, представляя для этого набор операций или методов, описывающих его действия.

    Представление связей

    Для представления некоторых связей модели используются вложенные элементы структуры документа XML. Очевидными кандидатами на подобное представление являются связи "содержания".
    Элемент может содержаться непосредственно только в одном порождающем элементе, так что другие связи модели следует устанавливать иначе. На практике это означает использование какой-либо разновидности ссылок.

    Представление свойств

    Обнаружив свойство в своей информационной модели, мы сталкиваемся с классической дилеммой: в документе XML представлять его с помощью атрибута или вложенного (порожденного) элемента. Приняв решение по этому поводу, можно приступать к остальным задачам.
    Рассмотрим практические преимущества и недостатки каждого подхода.
    ПреимуществаНедостатки
    Атрибуты XML С помощью определений DTD можно ограничивать принимаемые значения; полезно, если имеется небольшое количество разрешенных значений, таких как "yes" и "nо"Принимает только простые строковые значения
    В DTD можно определить значение по умолчаниюОтсутствует поддержка метаданных (или атрибутов у атрибутов)
    Использование атрибутов типа ID и IDREFНеупорядоченность
    Небольшие требования к месту на диске (существенно, когда по сети посылаются гигабайты информации)
    Для некоторых типов данных (например, NMTOKENS) возможна нормализация пустых пространств, что избавляет приложение от этих действий
    Легко обрабатывать с помощью интерфейсов DOM и SAX
    Порожденные элементыПоддержка произвольно сложных и повторяющихся значенийНесколько более высокие требования к дисковому пространству
    УпорядоченностьБолее сложное программирование
    Поддержка "атрибутов у атрибутов"
    Возможность расширения при изменении модели данных

    Баланс всех факторов зависит от конкретного приложения.

    Представление типов объектов

    В общем случае тип объекта в информационной модели будет транслирован в тип элемента в структуре XML.
    В качестве имени элемента можно использовать название типа объекта или, если нужно сберечь место на диске, это имя можно сократить. Часто для тегов элементов применяются такие короткие имена. Это связано не с экономией дискового пространства, а с тем, что документ XML становится более читаемым: такие теги не слишком отвлекают внимание от содержания.
    Если тип объекта входит в состав иерархии типов, нужно определить, на каком уровне иерархии основать элементы XML.

    Проектирование документов XML

    Существует два типа данных: информационные хранилища, предназначенные для долговременного хранения данных, и потоки сообщений, передающие временную информацию из одной подсистемы в другую.
    Язык XML применим в обоих случаях, но подходы к проектированию различны.

    Роль схемы

    Формальная роль схем заключается в описании группы всех возможных допустимых документов, или, иначе выражаясь, в описании ограничений, помимо налагаемых самим языком XML, которым должен соответствовать документ, чтобы быть значимым.
    Используя слово "допустимость" (validity) в этом контексте, следует быть очень осторожным. В соответствии со стандартом XML допустимость означает соответствие документа правилам, содержащимся в DTD. Но сейчас мы говорим о таких ограничениях, которые не могут быть выражены в DTD, а некоторые из них не могут также быть выражены и в схемах XML.

    Схемы как набор ограничений

    Одной из задач схем является определение различий между допустимыми и недопустимыми документами. Насколько это, возможно, правила следует выражать таким способом, чтобы программное обеспечение само могло решить, является ли документ допустимым; однако на практике всегда остаются такие правила, которые может интерпретировать только человек.
    Конечно, не всегда правильно налагать ограничения. Существует огромное искушение бездумно воспользоваться правом устанавливать правила и сделать систему чрезмерно жесткой. Информационные системы пользуются плохой репутацией из-за их негибкости, и надо вдумчиво использовать ограничения, позволяя людям в процессе работы проявить свой интеллект. В противном случае ограничения могут негативно повлиять на качество информации.
    Возможность определять недвусмысленные правила и проверять их программными средствами не означает, что мы должны делать это на каждом удобном этапе обработки. Например, нет необходимости проверять документ в момент его доставки с Web-сервера: прежде всего его допустимость должна быть проверена при поступлении туда. Однако некоторые программисты несмотря ни на что слепо используют во всех случаях проверяющий на допустимость анализатор. Аналогично при отправке документов XML из одной программной системы в другую в рамках той же организации имеет смысл проверять допустимость только на этапе тестирования, но если все работает нормально, одно приложение уже может доверять другому.

    Схемы как объяснение

    Вторая задача схем заключается в объяснениях - необходимо документировать интерпретацию и использование предоставляемых конструкций так, чтобы отправитель и получатель сообщения одинаково понимали его смысл.
    В традициях работы с документами и базами данных роль схем вторична, хотя потенциально она более важна. Частично проблема связана с тем, что схемы как правило не доходят до людей, которым надо знать эту информацию, особенно до пользователей, вводящих данные на экране. В связи с этим большое количество систем страдает от так называемого семантического сдвига, тенденцией сообщества пользователей со временем изменять способ использования системы и значения, связываемого ими с полями данных, даже если программные структуры остаются неизменными.
    Поскольку конечные пользователи не будут специально изучать схему, эти схемы должны стать доступными для чтения с помощью приложения: например, следует обеспечить возможность извлекать описание полей данных и показывать его в качестве совета на экранах ввода информации. Схемы как объяснение <

    Статическая информационная модель

    При построении статической информационной модели необходимо пройти следующие этапы:
    Этап 1. Идентификация понятий, присвоение им имен и их определение
    Этап 2. Организация понятий в иерархию классов
    Этап 3. Определение связей, множественности и ограничений
    Этап 4. Добавление свойств для конкретизации деталей значений, связанных с объектами

    Варианты использования

    Варианты использования (use cases) анализируют выполнение специфических задач пользователя (например, человек, купивший туристическую поездку, отменяет свой заказ). Вариант использования напоминает модель процесса, но в общем случае заостряет внимание на деятельности одного конкретного пользователя.
    Варианты использования могут быть полезны как на этапе моделирования деловой активности, так и при описании внутреннего поведения информационных систем. Одна из опасностей заключается в смешении двух уровней. Лучше этого не делать, поскольку они представляют интерес для различных аудиторий.
    Представленный в виде варианта использования диалог пользовательского интерфейса описывает, какой информацией пользователь обмениваются с системой, а не то, как она представлена на экране. Это естественным образом приводит к реализации XML, в которой информационное содержание отделено от особенностей представления.

    Выбор подхода к динамическому моделированию

    Модели нужны только как рабочие инструменты, дающие возможность при встрече с пользователями прийти к соглашению по вопросу о том, как она должна работать. Поэтому не нужно рассматривать все модели. Достаточно рассмотреть только те, которые действительно дадут необходимую информацию о разрабатываемой проблеме. Эти диаграммы самостоятельно появятся в проекте XML, когда начнется описание сообщения между подсистемами.

    Жизненные циклы объекта

    Жизненные циклы объекта (на языке UML это называется линиями жизни объекта) также заостряют внимание на индивидуальных объектах, но придерживаются более целостного подхода. Они описывают, что происходит с объектом на протяжении его жизни: как он создается, какие события с ним происходят, как он реагирует на эти события и какие условия приводят в конце к его разрушению.
    Жизненные циклы объекта очень полезны для тестирования завершенности модели. Часто наблюдается тенденция к акцентированию внимания только на некоторых событиях за счет остальных. Пока мы не определим, каким образом каждый объект попадает в систему и как он удаляется из нее, полного понимания не будет.

    Языки информационного обмена

    Диаграммы взаимодействия объектов

    Диаграммы взаимодействия объектов позволяют проанализировать обмен сообщениями между объектами на более тонком уровне детализации, чем модель потока данных.
    Диаграммы взаимодействия объектов неоценимы, если требуется описать взаимодействие между различными системами. Они позволяют определить, какая информация содержится в каком сообщении. Поскольку эти сообщение написаны на языке XML, диаграммы взаимодействия объектов дают нам контекст, требуемый для начала проектирования структуры XML каждого индивидуального сообщения.

    Динамическая информационная модель

    Динамические модели описывают, что происходит с информацией: примерами таких моделей являются диаграммы рабочих процессов, потоков данных и жизненных циклов объектов. Динамические модели состоят примерно из таких утверждений: "Отделение патологии отправит результаты теста консультанту, отвечающему за пациента". Динамические модели описывают процесс обмена информацией: данные отправляются из одного места в другое с конкретной целью.
    Для построения динамической модели можно воспользоваться различными программными системами (например, диаграммы рабочих процессов и диаграммы потоков данных можно построить, воспользовавшись программой BPWin).
    Существует несколько подходов к динамическому моделированию:
  • Модели рабочих процессов
  • Модели потоков данных
  • Объектные модели
  • Жизненные циклы объектов
  • Варианты использования
  • Диаграммы взаимодействия объектов


  • Этап 1. Именование понятий

    Для начала нужно составить список понятий, относящихся к системе. Иногда предлагают даже описать систему на бумаге и выделить все существительные. В любом случае этот этап, как правило, не представляет затруднений.
    Далее, и это иногда требует больше времени, надо описать типы объектов. Описание термина должно быть точным, чтобы не возникало разногласий по существу определения. Ценность моделирования в том и заключается, что оно предотвращает появление потенциальных источников непонимания.
    По завершении работы, вероятно, получится длинный список типов объектов, и у некоторых будут длинные имена. Следует выбирать такие имена, которые занятые в этом бизнесе люди смогут корректно понять и интерпретировать: дело в том, что они не всегда будут сверяться с написанными определениями.
    Помимо именования типов объектов стоит определить также, каким образом можно идентифицировать индивидуальные экземпляры. Возможно, в этом виде бизнеса существует код, который следует знать, или написать его. Надо принимать во внимание, что в схемах кодирования в бизнесе часто обнаруживаются проблемы.
    В конце этого этапа мы получим список типов объектов с именами и определениями, по поводу которых достигнуто соглашение.

    Этап 2: Таксономия

    Таксономия - это термин, используемый в биологии для обозначения системы классификации; в информационном моделировании ее также называют иерархией типов (иногда ее называют еще онтологией). Перечислив и назвав типы объектов, их надо организовать в иерархическую схему классификации. Часто эти иерархические отношения возникают уже на этапе определения типов объектов.
    Ключевой здесь является фраза, определяющая принадлежность (в английском языке - is или is kind of). Написав предложение вида "А есть разновидность В" или "Каждое А есть В", вы определили отношения подтипов в вашей таксономии.
    Иногда эти действия называются тестом "is а" ("есть", "представляет собой"). Однако будьте внимательны, поскольку эта конструкция используется также и для описания отношений между конкретным экземпляром и его типом, безопаснее писать этот тест в форме "is a kind of" ("представляет собой разновидность").
    Идентификация подтипов бывает, полезна при проектировании документа, что более важно, она помогает лучше понять определения типов объектов.
    Если вы занимались объектно-ориентированным программированием, то понимаете, как определять иерархии типов. Но программисты часто рассматривают классы объектов, прежде всего в терминах модулей функциональности внутри системы, а не понятий, которые они представляют в окружающем мире. Тогда для обозначения типов объектов используются глаголы, а не существительные - что неверно.
    Итак, этап 2 сводится к организации типов объектов в иерархию типов.

    Этап 3: Поиск связей

    После того как объекты названы, в статическом информационном моделировании надо определить связи, существующие между ними. Связи (на языке UML они называются ассоциациями) можно показать просто сформулировав их в виде обычных предложений или их можно показать графически в виде диаграммы. Для диаграмм, описывающих связи между объектами, существует большое количество нотаций, каждый может выбрать более предпочтительную для себя. Диаграммы следует делать предельно простыми и интуитивно понятными, сосредоточившись на ключевых сообщениях и оставив подробности текстовым документам, которые проще обслуживать.
    Существует некая информация, которую надо знать о каждой связи:
  • Множественность связи показывает сколько объектов каждого типа принимать в ней участие.
  • Связи типа "один-ко-многим": одна глава содержит много параграфов, один человек покупает много туристических поездок.
  • Связи типа "многие-ко-многим" также часто встречаются: один автор может написать несколько книг, но у книги также может быть несколько авторов.
  • Связи типа "один-к-одному".

  • При моделировании информации для окончательного представления XML особенно важным типом связей являются связи включения. Множественность этих связей всегда бывает "один-ко-многим" и "один-к-одному". Хотя четкого правила по поводу того, какие объекты образуют связи включения, не существует, можно иногда использовать правила обычного языка: глава содержит параграфы, курорт содержит отели, а отель содержит посетителей. В языке UML определено две формы связей включения. Первая - это агрегации, относительно свободное объединение объектов, позволяющее рассматривать их группу в течение некоторого времени как целое (например, туристическая группа, одни и те же люди могут в разное время входить в разные группы). Вторая форма - композиция. Это более строгая форма; отдельные части целого не могут существовать независимо от него (например, комнаты в отеле не могут существовать независимо от отеля).

  • Найти подходящие имена для связей иногда бывает нелегко. При записи связей полезно использовать полные фразы типа "отель расположен на курорте" или "человек - это автор книги". Нам не надо использовать эти имена в тегах разметки XML, они присутствуют только в документации на систему.
    Итак, в конце этапа 3 мы определили связи существующие между типами объектов в нашей модели.

    Этап 4. Описание свойств

    Типы объектов и связи формируют скелет статической информационной модели; свойства можно сравнить с плотью на костях. Свойства представляют собой простые значения, ассоциированные с объектами. У человека можно определить рост, вес, национальность и род занятий; отель имеет определенное количество комнат, этажность и ценовую категорию.
    Не следует снова включать связи в список свойств объекта: расположение отеля не является его свойством, если мы уже промоделировали его как связь с курортом.
    Главное, что нам надо знать о свойствах, - это тип их данных. Определен ли для них фиксированный диапазон значений, являются ли они числовыми, в каких единицах выражаются? Является ли свойство обязательным и есть ли у него значение по умолчанию?
    В конце этапа 4 мы завершили формирование статической информационной модели: получили полное описание типов объектов в системе, их связей друг с другом и их свойств.

    Контрольные вопросы:

  • Дать определение статической информационной модели.
  • Какие этапы необходимо пройти при построении статической информационной модели.
  • В чем заключается этап "идентификация понятий" при построении статической информационной модели.
  • В чем заключается этап "организация понятий в иерархию классов" при построении статической информационной модели.
  • В чем заключается этап "определение связей" при построении статической информационной модели.
  • В чем заключается этап "описания свойств" при построении статической информационной модели.
  • Дать определение динамической информационной модели.
  • Что представляют собой модели рабочих процессов.
  • Что представляют собой модели потоков данных.
  • Что представляют собой объектные модели.
  • Что описывают жизненные циклы объектов.
  • Что описывают варианты использования.
  • Что описывают диаграммы взаимодействия объектов.

  • Контрольные вопросы: <

    Методические указания

    Существуют два основных типа информационной модели: статическая и динамическая.

    Модели потоков данных

    Модели потоков данных очень напоминают предыдущий тип, но здесь основное внимание уделяется информационным, а не бизнес- систем. Эта модель описывает хранилища данных (data stores), где информация находится постоянно (это может быть база данных в компьютере или просто кабинет с папками), процессоры, манипулирующие с этими данными, и потоки данных, передающие данные от одного процессора другому. Она активно использует статическую информационную модель: последняя описывает, что означают такие концепции, как путешественник или отель, но ничего не сообщает о том, где содержится информация. Напротив, из модели потоков данных становится ясно, что информация о туристической поездке находится в базе данных покупок до завершения поездки и оплаты всех счетов, после чего резюме этой информации передается в маркетинговую информационную систему, а все остальное - в архив.

    Модели рабочих процессов

    Модели рабочих процессов заостряют внимание на роли людей и организаций в выполнении работы, хранение и обработка информации играют в них вторичную роль. Модель процесса описывает, например, что будет с путешественником, если на отдыхе с ним произойдет несчастный случай. Она определяет, за какие действия отвечает локальный представитель на курорте, агент в стране, где находи курорт и главный офис. В результате становится ясно, кто должен отвечать за организацию медицинской помощи, за перевозку туриста домой и за информирование родственников. Она может описывать различные формы, заполняемые и пересылаемые между участниками, и вообще не привлекать компьютерные системы. Модель процесса обычно фокусирует внимание на ролях, обязанностях и задачах каждого действующего лица системы (actor), а workflow-модель имеет дело с документами, передаваемыми между действующими лицами. Модели потоков данных.

    Объектные модели

    Объектные модели содержат как динамический, так и статический компоненты. Динамическая или поведенческая часть определения объекта сосредоточена на том, что может делать или делал каждый объект, представляя для этого набор операций или методов, описывающих его действия.

    Содержание работы

  • Изучить основные принципы построения статической и динамической модели.
  • Построить статическую и динамическую модель для заданного варианта.
  • Оформить отчет, включающий постановку задачи, статическую и динамическую модели.
  • Защитить лабораторную работу.


  • Статическая информационная модель

    В статической модели описываются допустимые состояния системы. В статических моделях описываются типы объектов в системе, их свойства и связи. Описывая объекты, они определяют, разумеется, и их имена. Достичь соглашения по именованию всех объектов означает выиграть половину битвы, именно поэтому информационные модели XML иногда называют словарями.
    При построении статической информационной модели необходимо пройти следующие этапы:
    Этап 1. Идентификация понятий, присвоение им имен и их определение
    Этап 2. Организация понятий в иерархию классов
    Этап 3. Определение связей, множественности и ограничений
    Этап 4. Добавление свойств для конкретизации деталей значений, связанных с объектами

    Варианты использования

    Варианты использования (use cases) анализируют выполнение специфических задач пользователя (например, человек, купивший туристическую поездку, отменяет свой заказ). Вариант использования напоминает модель процесса, но в общем случае заостряет внимание на деятельности одного конкретного пользователя.
    Варианты использования могут быть полезны как на этапе моделирования деловой активности, так и при описании внутреннего поведения информационных систем. Одна из опасностей заключается в смешении двух уровней. Лучше этого не делать, поскольку они представляют интерес для различных аудиторий.
    Представленный в виде варианта использования диалог пользовательского интерфейса описывает, какой информацией пользователь обмениваются с системой, а не то, как она представлена на экране. Это естественным образом приводит к реализации XML, в которой информационное содержание отделено от особенностей представления.

    Жизненные циклы объекта

    Жизненные циклы объекта (на языке UML это называется линиями жизни объекта) также заостряют внимание на индивидуальных объектах, но придерживаются более целостного подхода. Они описывают, что происходит с объектом на протяжении его жизни: как он создается, какие события с ним происходят, как он реагирует на эти события и какие условия приводят в конце к его разрушению.
    Жизненные циклы объекта очень полезны для тестирования завершенности модели. Часто наблюдается тенденция к акцентированию внимания только на некоторых событиях за счет остальных. Пока мы не определим, каким образом каждый объект попадает в систему и как он удаляется из нее, полного понимания не будет.

    Языки информационного обмена

    DOM и базы данных

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

    Использование модели DOM на сервере

    Поскольку разработчики Интернет -приложений имеют значительно больший контроль над программным обеспечением, устанавливаемым на их серверах, первые приложения DOM, как правило, были нацелены именно на эту область. Модель DOM позволяет существенно упростить обмен данными между различными деловыми системами, а также предоставляют идеальный механизм для архивирования и извлечения данных.

    Использование модели DOM у клиента

    В настоящее время становится все более важно, чтобы документ можно было читать различными клиентами. Эти клиенты могут визуализировать документ по-разному, в зависимости от типа клиента и назначения файла. Пользовательский браузер с помощью модели DOM изучит дерево узлов документа и отобразит необходимую клиенту информацию.
    По мере интеграции модели DOM в основные браузеры станет возможно с помощью манипуляций документами XML у клиента добиваться более эффективного взаимодействия с пользователями. Структурированную информацию можно собирать у клиента и отправлять на сервер за одну транзакцию, а не с помощью нескольких обращений к формам, находящимся на различных страницах HTML.
    Так же возможно широкое использования модели DOM для генерации и манипулирования документами XML в среде предприятия.

    Клиент и сервер

    Все приложения DOM и XML можно разделить на две группы: устанавливаемые на сервере (или в таком контролируемом окружении, как системы типа клиент/сервер) и устанавливаемые у клиента.

    Модель DOM в окружающем мире

    Компания Netscape в версии 4.7 своего браузера еще не предлагает встроенной поддержки DOM, но при наличии библиотек ActiveX или Java DOM можно обращаться к документам XML и работать с ними у клиента с помощью языков Java и JavaScript. Следующие версии браузера Netscape включает встроенную поддержку XML и XSL.
    В браузерах Internet Explorer 5 и выше находятся встроенные библиотеки DOM и поддержка XSL. Для сценариев на стороне клиента доступно множество объектов для работы с XML-документом, самые важные из них, объекты XMLDOMDocument, XMLDOMNode, XMLDOMNodeList, XMLDOMParseError представляющие интерфейс для доступа ко всему документу, отдельным его узлам и поддеревьям, предоставляющие необходимую для отладки информацию о произошедших ошибках анализатора соответственно.

    Объект XMLDOMDocument

    Объект XMLDOMDocument представляет верхний уровень объектной иерархии и содержит методы для работы с документом: его загрузки, анализа, создания в нем элементов, атрибутов, комментариев и т.д. Многие свойства и методы этого объекта реализованы также в классе Node, т.к. документ может быть рассмотрен как корневой узел с вложенными в него поддеревьями.

    Объект XMLDOMNode

    Объект XMLDOMNode, реализует базовый DOM интерфейс Node, предназначен для манипулирования с отдельным узлом дерева документа. Его свойства и методы позволяют получать и изменять полную информацию о текущем узле - его тип (является ли текущий узел элементом, комментарием, текстом и т.д.), название, полное название (вместе с Namespace префиксом), его содержимое, список дочерних элементов и т.д.

    Объект XMLDOMNodeList

    Представляет собой список узлов - поддеревья и содержит методы, при помощи которых можно организовать процедуру обхода дерева.

    Объект XMLDOMParserError

    Объект позволяет получить всю необходимую информацию об ошибке, произошедшей в ходе разбора документа. Все свойства этого объекта доступны только для чтения.

    Объектная модель документа

    В течение некоторого времени термин "объектная модель документа" применялся к Web-браузерам. Такие объекты, как окно, документ и история, считались частью объектной модели браузера, но в различных браузерах эти объекты реализованы по-разному. Для создания более стандартизированного способа обращения и манипулирования структурами документов в сети консорциум W3C предложил спецификацию W3C DOM представляющую собой не зависящее от языка или платформы определение. W3C DOM модель устанавливает стандартную функциональность для навигации по документу и манипулирования содержанием и структурой документов, написанных на языках XML и HTML.
    При использовании DOM для работы с текстовым файлом в формате XML она анализирует файл, разбивает его на индивидуальные элементы, атрибуты, комментарии и т.д. Затем в памяти создается представление файла XML в виде дерева узлов в котором каждый объект в документе рассматривает в виде узла: элементы, атрибуты, комментарии, команды обработки и даже составляющий атрибуты обыкновенный текст. Для следующего фрагмента XML документа:
    text text
    дерево элементов выглядит так:
    Объектная модель документа

    После этого разработчик может обращаться к содержанию документа, используя дерево узлов, и при необходимости вносить в него изменения, например чтобы добавить новый элемент( для этого достаточно просто создать новый узел и прикрепить его в качестве потомка к нужному узлу).
    В W3C DOM для различных составляющих DOM объектов определены интерфейсы облегчающие манипулирование с деревом узлов, но для этих интерфейсов не предлагается никакой специфической реализации, и ее можно осуществить на любом языке программирования. Определяемая консорциумом W3C модель DOM не зависит от платформы, т.е. W3C определяет, какие методы и свойства должны быть сделаны доступными в реализациях, специфических для конкретных систем, но не подробности осуществления этих реализации. Реализуя приложение использующие модель DOM, а не спецификации W3C, разработчики должны ссылаться на документацию, специфическую для данной реализации, которую можно найти в библиотеках. Например, компания Microsoft предоставляет такую документацию для своей версии XML DOM по адресу http://msdn.microsoft.com/xml/reference/xmldom/start.asp.

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

    Модель DOM - это модель с произвольной выборкой, т.е. узел может быть создан или прикреплен в любом месте дерева XML в любой момент времени. Эта особенность очень полезна при создании документов XML на основе информации иерархической или реляционной базы данных.
    Создать документ XML с помощью модели DOM значительно проще, чем записывать информацию в текстовый файл. Вместо того чтобы все время перемещаться между таблицами в поисках требуемой информации, всю информацию из каждой таблицы можно записать одновременно. С увеличением глубины дерева узлов первый метод становится все более и более запутанным, в то время как второй легко масштабируется. Кроме того, генерация документа с помощью модели DOM гарантирует его правильное оформление.

    и проходит все узлы, используя

    x=getchildren(myDoc); //***************Начало рекурсивной функции************* function getchildren(node) { var x=node.childNodes; var z=x.length; if (z!=0) { for(var i=0;i"); getchildren(x(i)); document.write(""); document.write("
    "); } else if (x(i).nodeName=="type") { document.write("
    "); getchildren(x(i)); document.write("
    "); document.write("
    "); } else if (x(i).nodeName=="file") { document.write("
    "); document.write(""); document.write("Файл"); document.write(""); document.write("
    "); document.write("
    "); } else { getchildren(x(i)); } } } }
    Листинг 6.1.
    Закрыть окно






    x=getchildren(myDoc);
    //***************Начало рекурсивной функции*************
    function getchildren(node)
    {
    var x=node.childNodes;
    var z=x.length;
    if (z!=0)
    {
    for(var i=0;i

    Пример использования модели DOM.

    Рассмотрим простейший пример обработки XML документа с использованием DOM модели.
    Рассмотрим следующий XML документ:
    Языки информационного обмена Лекции Лекции.doc
    Для отображения данного документа можно использовать следующий простой рекурсивный цикл.
    x=getchildren(myDoc); //***************Начало рекурсивной функции************* function getchildren(node) { var x=node.childNodes; var z=x.length; if (z!=0) { for(var i=0;i"); getchildren(x(i)); document.write("
    "); document.write("
    "); } else if (x(i).nodeName=="type") { document.write("
    "); getchildren(x(i)); document.write("
    "); document.write("
    "); } else if (x(i).nodeName=="file") { document.write("
    "); document.write(""); document.write("Файл"); document.write(""); document.write("
    "); document.write("
    "); } else { getchildren(x(i)); } } } }
    Листинг 6.1.
    Функция getchildren кода принимает в качестве параметра узел, создает список всех дочерних узлов, проходит по этому списку, проверяя, имеет ли каждый дочерний узел свои собственные дочерние узлы, и если имеет, то вызывает сама себя. При этом к тегам с именами title, type, file применяются соответствующие стили.
    Применив эту функцию к нашему XML- документу мы получим на экране следующий результат:
    Пример использования модели DOM. Пример использования модели DOM. <

    Зачем нужна модель DOM

    В качестве метода доступа к файлам XML всегда следует выбирать модель DOM. По сравнению с такими доступными механизмами генерации документов XML, как запись непосредственно в поток, этот метод имеет ряд преимуществ:
  • Модель DOM гарантирует правильную грамматику и правильное оформление документов.
    DOM трансформирует текстовый файл в абстрактное представление дерева узлов. Это позволяет полностью избежать таких проблем, как незакрытые или неправильно вложенные теги. Работая с документом XML при помощи этого метода, разработчик должен беспокоиться не о текстовом выражении документа, а только о связях типа родитель-потомок и об относящейся к этому информации. Кроме того, DOM предотвращает создание неправильных связей родитель-потомок в документе.
  • Модель DOM абстрагирует содержание от грамматики.
    Созданное моделью DOM дерево узлов - это логическое представление содержания файла XML, показывающее, какая информация в нем представлена и как ее фрагменты соотносятся друг с другом, вне непосредственной связи с грамматикой XML. Информация дерева узлов используется для обновления реляционной базы данных или для создания страницы HTML, и разработчики при этом не должны вникать в специфику языка XML.
  • Модель DOM упрощает внутреннее манипулирование документом.
    Задача разработчика, использующего модель DOM для модификации внутренней структуры файла XML, упрощается по сравнению с работой тех, кто для этой цели применяет традиционные механизмы манипулирования файлами. Как уже было, описано DOM позволяет легко добавить элемент в середину документа. Кроме того, такие глобальные операции, как удаление из документа всех элементов с конкретным именем тега, могут быть выполнены с помощью пары команд, а не "метода грубой силы", предполагающего полное сканирование всего файла и удаление ненужных тегов.
  • Модель DOM напоминает структуры иерархических и реляционных баз данных.
    Способ, используемый DOM для представления связей между элементами данных, напоминает метод представления этой информации в современных иерархических и реляционных базах данных. С помощью этой модели упрощается процесс обмена данными между файлом XML и базой данных. Использование модели DOM для построения иерархической структуры документа позволяет легко передавать информацию между системами.


  • Языки информационного обмена

    Декларация пространства имен

    Поскольку в разных языках разметок - реализациях XML - могут встретится одни и те же имена тегов и их атрибутов, имеющие совершенно разный смысл, надо иметь возможность их как-то различать. Для этого имена тегов и атрибутов снабжают кратким префиксом, который отделяется от имени двоеточием. Префикс имени связывается с идентификатором, определяющим пространство имен (namespace). Все имена тегов и атрибутов, префиксы которых связаны с одним и тем же идентификатором, образуют одно пространство имен, в котором имена должны быть уникальны.
    Поскольку необходимо, чтобы, встретив декларацию пространства имен каждый мог распознать ее, для него зарезервируем специальное слово. В соответствии с рекомендацией пространств имен, это слово xmlns. Значением атрибута является идентификатор URI, определяющий используемое пространство имен. Часто это адрес URL определения DTD, но так должно быть не всегда. Префикс и идентификатор пространства имен определяются атрибутом xmlns следующим образом:

    Как видите, префикс ntb только что определен, но его уже можно использовать в имени ntb:notebook. В дальнейшем имена тегов и атрибутов, которые мы хотим отнести к пространству имен http://some.firm.com/2003/ntbml, снабжаются префиксом ntb, например:
    Горелово
    Кроме того, в одном теге могут встречаться сразу несколько пространств имен. Ниже приводится пример смешения нескольких пространств имен:

    Элемент book взят из пространства имен catalog, а атрибут ISBN - из order.
    Имя вместе с префиксом, например
    ntb:notebook
    или
    ntb:city
    называется расширенным, уточенным или квалифицированным именем (OName. Qualified Name). Часть имени, записанная после двоеточия, называется локальной частью (local part) имени.
    Номенклатура названий Web-ресурсов может запутать. Универсальный указатель ресурса (Uniform Resource Locator, URL) указывает на ресурс в терминах протокола доступа и расположения в сети.
    Универсальный идентификатор ресурса ( Uniform Resource Identifier, URI) представляет собой уникальное имя некоторого ресурса. Смотрите на URI просто как на уникальную строку символов, идентифицирующую пространство имен.

    По правилам SGML и XML, двоеточие может применяться в именах как обычный символ, поэтому имя с префиксом - это просто фокус, всякая программа, "не знающая" пространства имен, анализируя документ, рассматривает уточненное имя как обычное имя. Отсюда следует, в частности, что в объявлении типа документа (Document Type Declaration) нельзя опускать префиксы имен.

    Атрибут xmlns может появиться в любом элементе XML, а не только в корневом. Определенный им префикс можно применять в том элементе, в котором записан атрибут xmlns, и во всех вложенных в него элементах. Более того, в одном элементе можно определить несколько пространств имен.

    Во вложенных элементах пространство имен можно переопределить, связав префикс с другим идентификатором.

    Появление имени тега без префикса в документе, использующем пространство имен, означает, что имя принадлежит пространству имен по умолчанию (default namespace).

    Хорошо оформленный документ должен использовать пространств имен для всех своих элементов.

    Префиксы, начинающиеся с символов xml с любым регистром букв, зарезервированы за самим языком XML. Префикс xmlns используется для связи другого, определяемого, префикса с идентификатором его пространства имен. Префикс xmlns не нужно определять, он введен рекомендацией "Namespaces in XML" и связан там с идентификатором пространства имен http://www.w3.ori/2000 /xmlns/.

    Еще один префикс, xml, связан в той же рекомендации с идентификатором http://www.w3.org/XML/1998/namespace. Его тоже не надо определять в документе XML. Никакой другой префикс не может быть связан с этими идентификаторами.

    Пока есть только два атрибута с префиксом xml. Для каждого элемента верного документа, в котором используются эти атрибуты, они должны быть объявлены в описании DTD (Document Type Definition).

    Атрибут xml:lang определяет язык, используемый в содержимом элемента. Например, xml:lang="us", xml:lang="en-US", xml:lang="ru-RU". Атрибут можно использовать так:

    <р xml:lang="ru_RU" >3апись на русском языке

    Атрибут xml:space указывает программе-обработчику, как следует обрабатывать пробельные символы (пробелы, знаки горизонтальной табуляции и символы перевода строки), записанные в содержимом элемента. У атрибута есть всего два значения. Значение preserve предписывает сохранять пробельные символы в неприкосновенности. Это важно для некоторых текстов, например, программных кодов. Значение default оставляет пробельные символы на усмотрение программы-обработчика.

    Формат описания ресурсов

    Формат описания ресурсов (Resource Description Framework) играет главную роль в процессе создания метаданных. Он позволяет проектировщикам описывать объекты, добавлять свойства для их более полного описания и определения, а также формировать такие сложные утверждения о них, как утверждения о связях между ресурсами. Спецификации языка содержатся в двух разделах:
  • Модель и синтаксис
  • Схемы RDF

  • Базовая модель RDF охватывает модель описательных данных, которую можно выразить на языке XML, а также и другие виды синтаксиса. Разработанные при помощи RDF схемы могут определять не только домена и структуры, но также делать выводы об отношениях между обсуждаемыми объектами. RDF - сложный язык, но он обладает большими выразительными возможностями, и поэтому его сложность оправдана.
    RDF "стоит на трех китах": это ресурсы, свойства и утверждения.

    Квалифицированная область действия

    Описанный выше метод работает хорошо, если вы можете четко разделить ваши пространства имен. Но иногда бывает необходимо включить в документ отдельные имена из внешних пространств имен. Вместо того чтобы декларировать пространства имен для целой области, можно использовать квалифицированные имена. Объявите нужные вам пространства имен в начале документа, а затем квалифицируйте их в месте использования.

    Область действия по умолчанию

    Как и следовало ожидать, необходимость добавления префикса к каждому имени в документе быстро становится утомительной. Фактически, введя концепцию области действия имени, мы можем смешивать в нашем документе большое количество префиксов. Если мы определяем пространство имен по умолчанию, то предполагается, что ему принадлежат все неквалифицированные имена внутри области действия его декларации. Таким образом, пространство имен, объявленное по умолчанию в корневом элементе, считается пространством по умолчанию для всего документа и может быть перекрыто только более специфическим пространством имен, объявленным внутри документа.
    Чтобы пространство имен сделать пространством имен по умолчанию для некоторой области, достаточно опустить декларацию префикс.
    Если префикс объявлен, а затем использован совместно с именем, то говорят что пространство имен явным образом установлено. Чтобы отнести к пространству имен неквалифицированное имя, необходимо объявить пространство по умолчанию, которое включает это неквалифицированное имя (без префикса).

    Область действия

    У деклараций пространств имен имеется область действия, так же, как у деклараций переменных в языках программирования. Это важно, так как пространства имен не всегда декларируются в начале документа XML, иногда это делается в последующих его разделах. Декларация пространства имен применима к элементу, в котором она появляется, а также к потомкам этого элемента, даже если она не определена там явным образом. Имя может ссылаться на пространство имен, только если используется в области действия его декларации.
    Однако нам потребуется также смешивать области действия пространств имен в элементах, которые в противном случае наследовали бы другие пространства имен. В связи с этим определены два способа декларации области действия- default (по умолчанию) и qualified (квалифицированный).

    Описание содержания документа

    Предложение Document Content Description (DCD, описание содержания документа) поступило сразу после XML-Data. Это предложение представляет собой словарь RDF, явным образом предназначенный для декларации словарей XML. Его разработчики использовали выразительную мощь одного из стандартов представления метаданных - RDF - для создания стандарта с более ограниченной областью применения. Приблизительно это напоминает то, что язык XML является упрощенным множеством SGML.
    Язык DCD синтаксически напоминает XML-Data, хотя в нем и отсутствуют некоторые углубленные возможности последнего. Он строго ориентирован на определение словарей XML. Однако в этом языке сохраняется характерная для XML-Data поддержка сильной типизации данных, а также наследование элементов. Как и XML-Data, DCD разрешает проектировщику объявлять модель схемы открытой или закрытой. Но в отличии от XML-Data, DCD для этой цели использует тот же механизм, что и для определений элементов. DCD, так же, как и XML-Data, позволяет налагать ограничения на значение содержания элементов.
    Основанный на языке RDF, DCD является попыткой решения проблем определений DTD. Можно сказать, что в нем широкая мощность языка обменивается на направленную простоту. DCD - наиболее простой из языков описания метаданных. Он непосредственно решает существующие проблемы DTD и отказывается от их углубленной проработки, чтобы получить легко реализуемый стандарт схем XML.

    Проблемы определений DTD

    У определений DTD имеется ряд недостатков, которые выявляются при углубленной работе с XML:
  • Их сложно писать и понимать.
    Синтаксис определений DTD отличается от языка XML. Он является расширенной формой Бэкуса-Науэра (Extended Backus Naur Form, EBNF), и многие находят его трудным для чтения и использования. Предлагаемые схемы XML фактически, используют язык XML для описания определяемых ими языков, что устраняет необходимость изучения языка EBNF для их чтения и записи.
  • Программная обработка их метаданных затруднена.
    Использование языка EBNF, кроме того, затрудняет автоматизированную обработку метаданных в определениях DTD. Разумеется, для DTD существуют специальные анализаторы. Он должен загрузить и прочитать DTD, после чего сможет проверить соответствующий документ на допустимость. К сожалению, не предусмотрена возможность обратиться к DTD из программы, использующей модель DOM. Объектная модель не позволяет получить доступ к метаданным словаря, написанным на языке EBNF. Анализатор прочитает DTD и сохранит его информацию для себя. Безусловно, было бы удобно, если бы DTD было написано на языке XML, так что мы могли бы исследовать их так же легко, как мы исследуем документы, написанные в соответствии с содержащимися в них правилами. Такая возможность позволила бы при помощи DOM изучить структуру обнаруженных нами словарей и даже модифицировать их правила проверки допустимости в соответствии с теми или иными условиями программы.
  • Они не являются расширяемыми и не поддерживают пространства имен.
    Определения DTD представляют собой фиксированную сущность. В них должны существовать все правила словаря. Все, что вам может понадобиться, вы размещаете в вашем словаре. Не создавая внешних объектов, вы не сможете использовать имена из других источников.
    Создание и обслуживание ваших собственных подмножеств деклараций разметки станет значительно более удобным в результате использовании ссылки на существующее определение. Вы не можете позволить авторам документа включать в него что-нибудь интересное впоследствии, если соответствующее определение отсутствует в DTD.
    Конечно, не всегда надо предоставлять авторам документов такую свободу, но было бы хорошо использовать части существующей схемы при проектировании нового словаря.

    Поскольку все правила словаря должны находиться в DTD, вы не можете смешивать пространства имен. Хотя при помощи пространства имен можно ввести в документ тип элемента, нельзя ссылаться на декларацию элемента в DTD. При его использовании все его элементы должны быть объявлены в DTD.

  • Они не поддерживают типов данных.

    Одним из существенных преимуществ языка XML является то, что все документы полностью пишутся при помощи общего типа данных - текста. Задачи программирования, однако, требуют использовать и другие типы. Определения DTD предлагают не много других типов данных, что является серьезным недостатком, когда XML применяют в приложениях определенного типа

  • Они не поддерживают наследование.

    Итак, определения DTD прекрасно позволяют определять структуры документов. Если учесть, что язык XML произошел от SGML, который также использует DTD, можно легко понять выбор этих определений в спецификации XML 1.0. Однако при использовании XML не только для разметки текста, но и в ситуациях, требующих программирования, описанные ранее ограничения становятся чрезвычайно важными.



  • Пространства имен

    Пространства имен способны помочь пользователю в двух очень важных случаях. С их помощью можно:
  • совмещать документы из двух или более источников, не теряя при этом уверенности, что программа различит, из какого источника взят тот или иной элемент или атрибут;
  • по возможности разрешит агенту пользователя доступ к дальнейшему материалу, такому как определение типа документа (DTD) или другому описанию элементов и атрибутов.

  • Пространство имен представляет собой совокупность некоторых величин или характеристик, которые могут быть использованы в XML-документах как имена элементов или атрибутов. Пространства имен в XML определяются унифицированным идентификатором ресурса URI (в качестве URI можно использовать адрес DTD на вашем сервере). Он позволяет каждому пространству имен быть уникальным.
    Итак, для того чтобы эффективно использовать пространства имен в документе, комбинирующем элементы из различных источников, нам надо определить:
  • Ссылку на URI, описывающий использование элемента.
  • Псевдоним, позволяющий понять, из какого пространства имен взят наш элемент. Этот псевдоним имеет форму префикса элемента (например, если псевдонимом для неясного элемента Book является слово catalog, то, элемент будет называться ).


  • Пространство имен и схемы

    Ранее мы описали некоторые недостатки определений DTD, они связаны:
  • синтаксис этих определений отличается от синтаксиса XML (конкретно, используется так называемая расширенная форма Бэкуса-Наура, Extended Backus Naur Form);
  • эти определения не достаточно выразительны;
  • так как каждый пользователь может создавать свои собственные теги, то вполне вероятна ситуация когда для обозначения различных вещей люди будут пользоваться одними и теми же именами элементов. Даже если значения элементов одинаковы, их возможное содержание может изменяться в зависимости от определения. Таким образом, нам необходим способ, позволяющий определять конкретные виды использования элемента, особенно, если в одном документе мы смешиваем различные виды словарей. Для решения проблемы консорциум W3C выпустил спецификацию, называемую XML Namespaces (пространством имен XML), позволяющую определить контекст элемента в пространстве имен.
  • существуют ситуации, когда необходимо скомбинировать документы XML из разных источников, соответствующих различным определениям DTD. Например, такая ситуация возникает при описании большого объема информации, если отдельных DTD недостаточно для охвата всего объема или они трудны для понимания. Возникает она и в системах электронной коммерции при попытках объединить данные вашего делового партнера с вашими. Так же может возникнуть ситуация когда необходимо просто добавить свои настройки к уже существующей DTD для того чтобы обмениваться некоторой информацией в стандартном формате. К сожалению, рекомендация XML не предоставляет способа совмещения нескольким DTD в одном документе без их модификации или создания нового DTD (используя внешние ссылки).

  • В данной главе рассматриваются следующие два понятия - пространство имен и схемы XML. Пространства имен позволяют разработчикам XML разбивать сложную проблему на небольшие фрагменты и объединять несколько словарей в одном документе для полного ее описания. С помощью схем проектировщики словарей создают более точные определения, чем это было возможно в DTD, причем делают это, используя синтаксис XML.
    Эти два инструмента помогают решать сложные задачи, возникающие при использовании XML. Пространства имен и схемы позволяют проектировщикам и программистам XML:
  • Лучше организовывать словари для решения сложных проблем;
  • Сохранять сильную типизацию данных при преобразованиях в XML и из него;
  • Более точно и гибко описывать словари, чем это было возможно в случае DTD;
  • Читать правила словаря на языке XML, осуществляя доступ к его определениям без усложнения анализатора.


  • Ресурсы

    Ресурсом может быть любая ощутимая сущность в концептуальном домене, на которую можно сослаться по идентификатору URI, в любом объеме - от целого сайта до одного элемента на странице HTML или XML. Это может быть даже объект, недоступный в сети Web, например, напечатанная книга.
    Ресурсы типизированы; для определения категорий, из которых берутся специфические экземпляры ресурсов, используется система классов. Поддерживается наследование классов, так что разработчик может определить уровень описания от общего до узко специфического.

    Схемы

    DTD фактически представляют собой разновидность схемы. Однако, говоря о схемах, разработчики XML, как правило, имеют в виду замену DTD, написанную в соответствии с синтаксисом XML. В принципе, схемы можно считать механизмом создания ограничений, так как, хотя в них объявляются допустимые элементы или атрибуты, мы ограничиваем для пользователя выбор тегов и модели содержания.
    Обычно схемы можно считать метаданными, или данными о данных, при разработке схем учитываются не только определения словаря, но и разъяснения связей между определенными типами данных.
    Чтобы заменить определения DTD, надо предоставить, по крайней мере, те же возможности, которые предоставляют эти определения. Необходимо определять природу и структуру документов XML. Как и DTD, схемы представляют собой описание компонентов и правил словаря XML. Однако схемы уточняют DTD, позволяя точнее выражать некоторые концепции словаря. Кроме того, в схемах сделано несколько радикальных изменений. Используемый в них синтаксис полностью отличается от DTD. Они позволяют использовать имена из других схем, что решает проблему проверки допустимости. Они позволяют типизировать данные элементов и атрибутов. Можно сказать, схемы являются лучшим решением проблемы определения словарей.
    Язык XML хорошо согласуется с определениями DTD. В то же время их активно пытаются усовершенствовать. Было выдвинуто множество предложений (некоторые из них доступны на сайте W3C как примечания), они, как это ни парадоксально, не помогают, а затрудняют принятие рекомендации, которая отражала бы наиболее распространенные особенности, требуемые от схем. В частности, многие разработчики настаивают на поддержке сильной типизации, возможности проверять допустимость документа на основе нескольких пространств имен одновременно и периодического использования синтаксиса XML.

    Смешение словарей

    При проектировании словаря может иметь смысл разбить глобальную проблему на несколько составных частей. Для этого необходимы способы сегментации большой проблемы на несколько словарей. Однако при этом настоящая проблема, которую нужно решить, связана с объединением отдельных DTD в теле одного документа. Данная проблема может возникнуть и в случае если вы, например, работаете на корпорацию в которой скорее всего уже существует набор определений DTD и их использование может существенно облегчит работу, потому что они описывают проблему так, как ее понимают другие. Часто также бывает полезно повторное использование определений DTD, т.е. использование общих конструкций из ранее созданных определений DTD. Если вы разрабатываете приложение, которое должно связываться с программами внешнего партнера, вам, практически, ничего не остается, кроме повторного использования существующих концепций. Имеющиеся определения DTD составляют общепринятый язык, на котором надо говорить, чтобы быть понятым. Если концепция уже существует, надо работать так, чтобы быть понятым в терминах этой концепции.
    Когда вы используете полезные для вас определения из DTD других разработчиков или комбинируете сегментированные DTD для создания документа, описывающего сложную проблему, если в ваших документах используются элементы с одинаковыми именами, вы рискуете столкнуться с проблемой неясности и коллизии имен.
    Проблема еще больше обостряется при использовании экземпляров имен из нескольких DTD. В этом случае мы не знаем, какой элемент, на какое определение DTD ссылается, такая проблема правильно оформленных документов называется неясностью. Более того, если имена из документа требуют проверки допустимости, мы можем очень сильно "запутать" наше приложение. Это проблема называется коллизия имен.

    что ресурсы имеют свойства, которые

    Говорят, что ресурсы имеют свойства, которые определяют и описывают их. На свойства налагаются ограничения, которые определяют их форму. Эти ограничения уточняют типы значений, которые могут быть присвоены свойству, и диапазон буквенных значений данного типа, которые могут быть выбраны.

    Усилия по созданию схем

    В связи с необходимостью создания языка схем, призванного заменить и расширить DTD, было выдвинуто множество предложений. В их число входят:
  • RDF
  • XML-Data
  • Document Content Description (DCD)
  • Schema for Object-Oriented XML (SOX)
  • Document Definition Markup Language(DDML, ранее известный как XSchema)

  • Ни один из этих проектов не был формально поддержан консорциумом W3C, тем не менее, каждый из них рассматривается консорциумом в процессе его работы над схемами XML.

    Утверждения

    Описав имена и структуры при помощи ресурсов и свойств, можно сформировать утверждения о концептуальном домене. Для этого составляются триплеты из ресурсов (подлежащих), свойств (сказуемых) и значений (дополнений). В специфических утверждениях значения могут быть литералами, а для мощных утверждений, охватывающих целые классы, они представляют собой ресурсы.
    Может показаться, что для выполнения простого действия приходится затратить много усилий, но благодаря синтаксису можно делать утверждения о классах. Сделав в схеме больше утверждений, вы явным образом определите больший объем знаний о домене проблемы.
    RDF - чрезвычайно мощный язык, допускающий использование выразительных и гибких утверждений. Он решает проблему недостаточной поддержки сильной типизации в DTD, сильная типизация является центральной особенностью схемы RDF. Проектирование такой схемы, будучи трудоемким процессом, предполагает декларацию большого количества классов и свойств. Хотя возможность делать значимые утверждения была высоко оценена, она, вероятно, еще более мощная, чем это нужно для описания словарей XML.
    Сказанное не означает, что эта возможность не требуется и в других ситуациях. Утверждения RDF позволяют формально описать факты в формате, поддающемся чтению компьютером. Как правило, разрабатываемые нами, словари XML неявным образом полагаются на общее понимание образующих их концепций окружающего нас реального мира. С помощью утверждений RDF мы, по крайней мере, теоретически, можем ввести достаточно информации, чтобы приложение само могла обнаружить дополнительные сведения о словаре. Это позволяет более эффективно использовать новый словарь и определять, в каких случаях он может быть применен к решаемой нами проблеме.
    Однако для проектировщика, решающего задачи определения имен, структуры и связей, это может оказаться слишком большой нагрузкой.

    XML-Data

    Область применения стандарта XML-Data является более умеренной по сравнению с RDF.
    Стандарт XML-Data различает синтаксические и концептуальные схемы. Хотя в обеих используется один и тот же язык, они освещают размечаемые нами данные с разных сторон.
    Синтаксические схемы - это набор правил, предоставляющих процесс описания документов с помощью разметки; определения DTD являются примеров таких синтаксических схем. Синтаксические схемы XML-Data налагают сходные с DTD ограничения на структуру словаря.
    Концептуальные модели описывают связи между понятиями или объектами и, как таковые, они идеальны для моделирования реляционных баз данных. При помощи схем XML-Data можно установить связи, основанные на том, что книги содержат заголовки и цены. Это делается способом, отличающимся от синтаксиса любого документа XML. Новый стандарт предназначается для того, чтобы расширить область применения языка XML, включив в него информацию о реляционных базах данных. Главные связи, выраженные ключами в реляционных базах данных, можно формально выразить также и в схемах XML-Data.
    XML Data содержит интересные возможности, делающие его более мощным чем DTD:
  • Использование языка XML
    В языке XML-Data для конструирования схем используется словарь XML, что дает пользователям возможность читать и записывать схемы, не осваивая предварительно новый синтаксис. Это также дает возможность изучать схему или динамически создавать новую при помощи модели DOM и существующих анализаторов.
  • Типизация данных
    Язык XML-Data поддерживает сильную типизацию элементов и атрибутов, снимая, таким образом, одно из основных возражений против DTD. Это могут быть базовые типы, определенные в пространстве имен типов данных, или комплексные пользовательские типы, содержащиеся в схеме, предоставляемой проектировщиком. Приложение больше не должно понимать тип данных элемента или атрибута и перед использованием данных преобразовывать строки или текст в соответствующий формат. Требуемую информацию можно явным образом определить в схеме, а анализаторы выполнят преобразование по желанию приложения.

  • Ограничения на допустимые значения

    Язык XML- Data позволяет налагать ограничения на диапазон значений, принимаемых элементами и атрибутами, такие как минимальное и максимальное значения. Эта возможность часто бывает, полезна при проверке допустимости документов XML.

  • Наследование типов

    Механизмом, позволяющим повторно использовать элементы, является поддерживаемое языком XML Data наследование типов. Он позволяет выявлять и расширять элементы при описании объектов проблемы, решить которую мы пытаемся с помощью XML. Мы можем написать, например, некоторые общие надтипы, а затем уточнять их в более специфические классы элементов, добавляя или заменяя новые члены в декларации надтипа. В определениях DTD таким же способом используются сущности (entities), но наследование типов формализует процесс. Не имея формальной семантики, сущности могут быть использованы неверно, настолько, что это затруднит, а не облегчит работу пользователя. Формальный механизм наследования дает возможность повторного использования, сохраняя при этом некоторый контроль над реализацией этой возможности.

  • Открытые и закрытые модели содержания

    Еще одной мощной возможностью языка XML-Data являются так называемые открытые и закрытые модели содержания. Классическое определение DTD представляет собой закрытую модель. Соответствующие ей документы должны придерживаться правил и не могут содержать ничего, что не соответствует правилам, поскольку все они должны быть описаны в DTD.

    Если схема открыта, то соответствующие ей документы могут содержать и другую информацию, не объявленную в DTD. Соответствующая схеме часть документа должна подчиняться заложенным в ней правилам, но мы можем включать в него и другие пункты без ограничений со стороны текущей схемы. Эти пункты могут быть описаны в другой схеме, а могут быть, вообще, никак не ограничены. Можно использовать специальные значения. С точки зрения нашей дискуссии, более важно то, что документы открытой модели представляют собой способ, позволяющий смешивать пространства имен.Фрагмент информации, соответствующий одной схеме, можно включить в середину документа, соответствующего другой. Более того, можно явным образом объявить, что для конкретных элементов используется открытая или закрытая модель содержания. Для этого существует атрибут content, значением которого по умолчанию является open.

  • Расширенные конструкции ID и IDREF

    В языке XML-Data конструкции ID и IDREF расширяются отношениями. В отношении один элемент используется в качестве ключа или индекса для содержания другого элемента. Это непосредственно применимо к моделированию первичных и внешних ключей в реляционных базах.



  • XML Schema

    Все, что можно было описать с помощью DTD, содержится в части стандарта XML Schema, посвященного структурам. Поскольку схемы пишутся в соответствии с синтаксисом XML, структуры ссылаются на конструкции на этом языке, при помощи которых можно определять разметку. Это означает, что структуры представляют собой еще одно приложение XML (словарь XML для описания классов документа XML) и как таковое могут использовать схемы для описания самих себя.
    Итак, раздел схем спецификации представляет собой ту ее часть, в которой определены элементы и атрибуты для описания схем. Что более важно, в этой части описана модель содержания для элементов. Такая модель явным образом определяет допустимую внутреннюю структуру элементов. Структуры являются сердцем схем XML.
    В окружающем нас мире широко используются концепции чисел, строк и множеств, так что написанные на современных языках программы поддерживают большое количество тщательно проработанных систем встроенных типов данных и процедуры по определению новых типов. Добавление типов данных в проект XML Schemas станет важным подспорьем для программистов, использующих XML при работе с данными в своих приложениях. Такая поддержка типов данных предусматривает возможность проверять допустимость значения в документе, а также осуществлять преобразование из текстовой формы во встроенный тип при обработке документа XML. Таким образом, чтобы использовать документы XML в качестве основы для интеграции программ и систем, необходимо иметь возможность перехватывать (определять) типы данных размечаемой нами информации.
    Это обеспечивает вторая часть спецификации XML Schemas, носящая название XML Schemas: Datatypes. Она позволяет не только перехватывать базовые типы данных, но и записывать ограничения, налагаемые на данные в домене нашей проблемы. Она позволяет записывать числовые границы, множества и упорядоченные списки, а также создавать маски для допустимых строковых представлений наших данных.
    Типы данных схем имеют набор четких значений, называемый пространством значений (value space). Он представляет собой абстрактную коллекцию значений, которые может принимать тип. Например, множество целых чисел является пространством значений для типа integer. Это пространство характеризуется ограничивающими свойствами и операциями над значениями в нем.
    Часть XML Schema: Datatypes целиком посвящена вопросам определения пространств значений, а затем перечислению ограничивающих свойств типа. Он содержит множество примитивных типов данных и предоставляет механизм генерации новых типов на их основе. В проект входит большое количество таких генерированных типов, находящих широкое применение, но его составители приветствуют создание собственных типов, предназначенных для использования в конкретном приложении. XML Schema <

    Языки информационного обмена

    Адресация на языке XPath

    Для удобной работы с документом XML необходимы средства, позволяющие точно адресовать ту или иную его часть: отдельную точку, множество точек, какой-либо участок или множество участков документа. Такие средства предоставляет язык XPath, разработанный консорциумом W3C. Язык XPath, как и XPointer, - не реализация XML. Его основу составляют выражения различных типов, в числе которых логический, числовой и строковый тип. В выражениях записываются константы, переменные и функции, входящие в состав XPath. Они связываются операциями, характерными для данного типа. В результате вычисления выражения получается указание на какой-то один или сразу несколько участков документа.
    Очень часто выражение строится подобно пути к файлу в файловой системе, откуда и происходит название языка "XML Path", сокращенно XPath. При этом документ XML рассматривается как дерево.

    Атрибут

    У каждого атрибута документа должен быть один информационный пункт. Если процессор распознает пространства имен, то используемые для их определения атрибуты в списке данных информационных пунктов представлены не будут.
    У информационных пунктов атрибутов имеются следующие свойства:
  • Фрагмент URI имени атрибута, при наличии.
  • Локальная часть имени атрибута.
  • Упорядоченный список информационных пунктов символов для каждого символа в (нормализованном) значении атрибута. При желании в этот список можно также включить информационные пункты маркеров начала и конца сущностей для всех ссылок на объекты в значении атрибута.
  • По желанию разработчика можно указать флаг, определяющий, значение этого атрибута определено либо задано по умолчанию в определении DTD или в схеме.
  • По желанию разработчика можно указать значение атрибута по умолчанию из DTD.
  • По желанию разработчика можно указать тип, объявленный для атрибута в определении DTD.


  • Декларация пространства имен

    Для каждого пространства имен существует одна декларация пространства имен, она объявляется (или подразумевается) как атрибут элемента.
    Информационный пункт декларации пространства имен имеет следующие свойства:
  • Объявляемое пространство имен. Это фрагмент имени атрибута, следующий за префиксом xmlns:.
  • Абсолютный идентификатор URI объявляемого пространства имен. Необходимо сообщить либо это свойство, либо следующее далее свойство потомка (описывающее текст), либо то и другое.
  • Упорядоченный список символьных ссылок на информационные пункты символов, которые составляют содержание значения атрибута. В него могут входить также маркеры начала и конца сущности, показывающие расположение ссылок на сущности. Должно присутствовать либо это, либо предыдущее свойство. Консорциум W3C добавил это свойство, чтобы обеспечить возможность определять пространства имен в будущих версиях не по URI.


  • Декларация типа документа

    Один информационный пункт декларации типа документа можно указать при желании разработчика и при наличии такой декларации.
    У информационного пункта декларации типа документа могут быть следующие свойства:
  • Ссылка на информационный пункт сущности для внешнего подмножества DTD.
  • Упорядоченный список ссылок на информационные пункты комментариев и команд обработки, присутствующие в DTD.


  • Дерево документа

    Язык XPath рассматривает документ XML как дерево. Корнем дерева будет корневой элемент документа, а узлами - вложенные элементы, содержимое элемента (текстовый узел) или его атрибуты. Кроме того, в узлах дерева могут находиться комментарии, инструкции по обработке, пространства имен.
    Схема element() не учитывает текстовые узлы и узлы-атрибуты. Она отмечает только вложенные элементы. Но схема xpointer() должна строго следовать правилам языка XPath и учитывать текстовые узлы, даже если они содержат только пробельные символы. Впрочем, многие программы-анализаторы языка XPointer не следуют этому правилу. Например, функция last() разными программами-анализаторами будет вычислена по-разному в зависимости от того, как они построят дерево документа.

    Язык XPath представляет документ в виде дерева, корнем которого служит корневой элемент документа. От корня отходят ветви, заканчивающиеся узлами. Узлами служат, например, вложенные элементы, их атрибуты и тексты, составляющие содержимое корневого элемента. От каждого вложенного элемента отходят свои ветви, рекурсивно повторяющие ветви корневого элемента. Таким образом, у каждого узла может быть только один узел - "предок", причем предком может быть только узел корневого или другого элемента дерева, но не атрибут и не текстовый узел.

    Документ

    Информационный пункт документа должен быть всегда ровно один, он содержит информацию о документе в целом и имеет следующие свойства:
  • Список порожденных информационных пунктов в порядке их следования в оригинальном документе. Сюда входит, по крайней мере, один информационный пункт элемента. Кроме того, список должен содержать все информационные пункты команд обработки, определенные вне контекста корневого элемента документа. По желанию разработчика в этот список могут входить также информационные пункты комментариев, находящихся вне корневого элемента документа, а также информационный пункты декларации типа документа (если в оригинальном документе такая информация определена).
  • Неупорядоченный набор из информационных пунктов нотаций для всех нотаций документа.
  • Неупорядоченный набор из информационных пунктов сущностей для всех не анализируемых сущностей документа. По желанию разработчика в этот список могут входить также информационные пункты для анализируемых сущностей, для сущности документа и для внешнего множества DTD.
  • При желании разработчик может включить сюда также идентификатор URI обрабатываемого документа.


  • Дополнения языка XPointer

    Исторически сложилось так, что язык XPath был создан на два года раньше языка XPoinler. Поэтому создатели языка XPointer внесли в него дополнения, расширившие конструкции языка XPath.
    Во-первых, кроме узлов дерева, язык XPointer рассматривает точки (points) и области (ranges).
    Точкой язык XPointer называет позицию между символами документа XML.
    Область занимает пространство между двумя точками: начальной точкой и конечной точкой. Начальная и конечная точки могут располагаться в любом месте документа XML, следовательно, область может пересекать элементы документа XML, не совпадая с узлами дерева. Разумеется, начальная точка должна встретиться в документе раньше конечной точки.
    Точки, области и узлы вместе образуют местоположение. В результате всякого поиска отыскивается некоторое местоположение или набор местоположений.
    Во-вторых, в схему xpointer() введены новые функции range(), stringrange(), range-to(), range-inside (), here(), origin (), start-point(), end-point(), работающие с точками и областями.
    Эти дополнения позволяют гораздо точнее адресовать различные части документа, вплоть до отдельного символа.
    Все действия с точками и областями выполняются с помощью перечисленных функций.

    Информационные пункты

    Имеющиеся пятнадцать различных пунктов информации совместно составляют правильно оформленный документ XML. Некоторые из этих пунктов должны присутствовать в грамматически разобранном (проанализированном) представлении документа XML, чтобы он мог быть конгруэнтным (по стандартам W3C) оригинальному документу, другие можно при желании опустить. Назовем типы информации (информационных пунктов):
  • Один информационный пункт документа (обязателен)
  • Один или больше информационных пунктов элементов (обязательно)
  • Информационные пункты атрибутов (обязательны)
  • Информационные пункты команд обработки (обязательны)
  • Информационные пункты символов (обязательны)
  • Ссылка на пропущенные информационные пункты сущностей (обязательны)
  • Информационные пункты комментариев (необязательны)
  • Информационный пункт декларации пункта документа (необязательны)
  • Информационные пункты объектов (обязательны для не анализируемых сущностей, необязательны для анализируемых сущностей)
  • Информационные пункты нотации (обязательны)
  • Информационные пункты маркера начала сущности (необязательны)
  • Информационные пункты маркера конца сущности (необязательны)
  • Информационные пункты маркера начала раздела CDATA (необязательны)
  • Информационные пункты маркера конца раздела CDATA (необязательны)
  • Информационные пункты декларации пространства имен (обязательны)

  • Необязательные пункты являются необязательными в том смысле, что они требуются в грамматически разобранном представлении документа для того, чтобы оно было достаточно конгруэнтно оригиналу в соответствии с определением InfoSet консорциума W3C.

    Использование простых указателей в ссылках

    Ссылки на информационный ресурс, содержащий указатели, записываются по правилам языка XLink, в который добавлена конструкция, взятая из языка HTML, а именно в ссылке на ресурс перед указателем ставится знак решетки #:

    Ссылка, записанная в том же самом документе mydoc.xml, начинается с решетки и выглядит так:

    Если в документе записано несколько одинаковых указателей label02, то ссылка будет связана с первым из них.
    Как видите, простые указатели языка XPointer только дублируют конструкции, давно применяемые в HTML и XML. Все новые возможности языка реализованы через указатели, основанные на схеме.

    Использование указателей в ссылках

    Указатели, основанные на схеме, используются точно так же, как и простые указатели. Они записываются в атрибутах элементов-ссылок после пути к файлу и отделяются от него "решеткой":


    Язык запросов XQuery

    После того как язык XML научился делать ссылки на языке XLink, создавать указатели XPointer на каждую точку документа и тонко адресовать любые части документа с помощью XPath, остался последний шаг: научиться извлекать найденную по адресу информацию из любых участков документа и оформлять ее в виде элементов документа XML. Язык XQuery как раз и призван сделать этот последний шаг.
    Поскольку перед извлечением информации из документа надо ее отыскать язык XQuery разрабатывался в тесной связи с языком XPath 2.0. Более того, большинство конструкций языка XPath 2.0 созданы в расчете на написание запросов. Многие выражения XPath, такие как выражение //ААА/ВВВ, делают запрос на поиск информации в документе XML. Поэтому язык XQuery можно считать расширением язык XPath 2.0. В нем можно применять почти все, что есть в языке XPath 2.0.
    Единственное ограничение - в первой версии языка XQuery, выражения, определяющие путь, можно направлять только по 6 осям из 13, имеющихся в языке XPath: child (по умолчанию), descendant, attribute, self, descendant-or-self и parent.
    Основной единицей языка XQuery, как и языка XPath, служит выражение, причем набор выражений, перечисленных через запятую, тоже считается выражением. Это так называемая "операция запятая", объединяющая несколько выражений в одно, вычисляемое последовательно слева направо. Результат вычисления выражения, как и в языке XPath, - последовательность узлов и/или атомарных значений. Виды узлов и типы атомарных значений таковы же, как и в XPath 2.0.
    Запрос в языке XQuery тоже оформляется как выражение. Разница заключается в том, что и результате вычисления выражения получается последовательность, а в результате выполнения запроса должен получиться один или несколько документов XML. Значит, в первую очередь язык XQuery должен научиться конструировать элементы XML. За это отвечают конструкторы.

    Элемент

    Для каждого элемента документа XML должен существовать один информационный пункт.
    Информационные пункты элемента имеют следующие свойства:
  • Упорядоченный список информационных пунктов порожденных элементов, команд обработки, ссылок на пропущенные сущности и символов в порядке их следования в документе. Этот список может быть пустым. При желании разработчика в него можно включить также информационные пункты комментариев. Кроме того, в список могут входить также информационные пункты маркеров: начала сущности, конца сущности, начала данных типа CDATA и конца данных типа CDATA; эти пункты могут входить только соответствующими парами (не должно быть маркера начала без маркера конца и наоборот).
  • Не упорядоченный список информационных пунктов атрибутов, по одному для каждого атрибута элемента. В набор входят также и атрибуты по умолчанию. Обратите внимание: если у элемента имеется атрибут пространства имен, а анализатор не распознает пространства имен, атрибут, включен в этот список для спецификации пространства имен; в противном случае он не будет туда включен. Этот список может быть пустым.
  • Содержащийся в имени элемента фрагмент, соответствующий универсальному идентификатору ресурса (URI), предоставляемый процессором пространства имен. Если анализатор не осуществляет обработки пространств имен или если пространство имен для элемента не определено, URI будет равен нулю.
  • Локальная часть имени элемента. Если анализатор не обрабатывает пространства имен, эта часть содержит все имя целиком (включая название пространства имен и двоеточие при наличии идентификатора пространства имен в имени элемента). В противном случае она представляет собой только локальную часть имени (после двоеточия) или имя целиком (если пространство имен не указано).
  • Неупорядоченный набор ссылок на информационные пункты деклараций пространства имен. Они соответствуют пространствам имен, объявленным в составе этого элемента.
  • По желанию разработчика сюда может входить также неупорядоченный список информационных пунктов деклараций пространств имен, которые соответствуют пространствам имен, объявленным в области действия этого элемента (т.е. в самом элементе или в одном из его предков).


  • Команды обработки

    Для каждой команды обработки документа должен существовать информационный пункт команды обработки. Декларация ХМL и декларации внешних анализируемых объектов сами по себе командами обработки не считаются.
    Информационные пункты команд обработки содержат следующие свойства:
  • Цель команды обработки. Это первый знак, следующий за символами "
  • Содержание команды обработки. Это остальной текст в теге перед закрывающими символами "?>", из которого удалено предшествующее ему пустое пространство. Может представлять собой, пустую строку.
  • Разработчик может указать также идентификатор URI объекта, первоначально содержавшего команду обработки (если команда обработки объявлена в тексте, это будет URI обрабатываемого документа, если он известен).


  • в документе можно определить один

    Для каждого комментария в документе можно определить один информационный пункт комментария.
    Информационный пункт комментария содержит свойство - содержание этого комментария.

    Конструкторы

    Конструктор узлов - это выражение, которое создает и добавляет к дереву документа новые узлы.
    Конструкторы могут создавать узлы каждого вида за исключением узлов пространств имен. При этом узел-элемент можно создать средствами прямого или вычисляемого конструктора, узел-атрибут, корневой узел документа и текстовый узел - только вычисляемого конструктора, а узлы-комментарии и узлы инструкций по обработке просто записываются в конструкторе прямо в том виде, в каком они затем появятся в документе.

    Маркер конца объекта

    Для того чтобы отметить конец текста, вставляемого из внешней анализируемой сущности, существует маркер конца сущности. Маркер не используется для параметрических сущностей.
    Информационный пункт маркера конца сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.

    Маркер конца раздела CDATA

    Для того чтобы показать конец текста, включенного в раздел CDATA, используется один маркер конца сущности. Информационный пункт маркера конца раздела CDATA не имеет свойств.

    Маркер начала раздела CDATA

    Для того чтобы показать начало текста, включенного в раздел DATA, используется один маркер начала объекта. Информационный пункт маркера начала раздела CDATA не имеет свойств.

    Маркер начала сущности

    Для того чтобы отметить начало текста, вставляемого из внешней анализируемой сущности, имеется маркер начала сущности. Маркер не используется для параметрических сущностей.
    Информационный пункт маркера начала сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.

    Нотация

    Для каждой объявленной в определении DTD нотации должен быть один информационный пункт нотации.
    Информационные пункты нотации содержат следующие свойства:
  • Имя нотации
  • Системный идентификатор нотации, или null, если он не был определен
  • Общий идентификатор нотации, или null, если он не был определен
  • Базовый идентификатор URI, соответствующий нотации


  • Понятие схемы в языке XPointer

    Слово "схема" в языке XPointer получило новое значение. Это запись вида
    element (color/3)
    похожая на запись функции и состоящая из имени схемы и данных, записанных в скобках.
    Схемы, записанные в указателе, просматриваются последовательно до тех пор, пока не будет найдена точка в документе, отвечающая какой-либо схеме. После этого просмотр указателя прекращается, оставшиеся схемы не рассматриваются. В приведенном выше примере, если будет найден элемент section, то схема element (color/3) рассматриваться уже не будет.
    Имя схемы - это уточненное имя типа Qname, состоящее из необязательного префикса, связанного с идентификатором пространства имен, и локальной части, отделенной от префикса двоеточием.
    Имена без префиксов зарезервированы за схемами, которые определяются в рекомендациях консорциума W3C. Каждая схема, предложенная консорциумом, описывается отдельной рекомендацией. Разработчики могут вводить свои семы, снабжая их имена префиксами.
    Смысл и правила записи данных зависят от вида схемы. Есть только одно общее правило, вытекающее из того, что данные записываются в скобках - все скобки, относящиеся к данным, должны быть парными или предваряться символом "каре" ("крышечкой"): xxx^(yyy или yyy^)xxx. Если же в данных встречается символ каре, то его следует удваивать: xxx^^yyy.
    Разумеется, схема- это не функция, она ничего не вычисляет и не выдает никакого результата. Это просто форма записи, несколько неожиданная и непривычная для языков, основанных на XML.

    Прямой конструктор элемента

    Самый простой способ сконструировать элемент XML- это записать его в явном виде с открывающим тегом, атрибутами, содержимым и закрывающим тегом. Эта форма называется прямым конструктором элемента.
    В прямом конструкторе, в содержимом конструируемого элемента, можно записать выражение в фигурных скобках. Оно будет вычислено, а результат вычисления подставлен в конструируемый элемент. Например:
    <аgе>{10 + 20 }
    Заметьте, что если не написать фигурные скобки, то выражение не будет вычисляться, а попадет в конструируемый элемент как простой текст.
    Если фигурные скобки надо понимать как простые символы, а не как команду вычисления выражения, то их следует удваивать.
    В общем случае прямой конструктор элемента состоит из элемента XML. В элемент могут быть вложены другие элементы, выражения в фигурных скобках и наборы символов - содержимое элемента. Конструктор преобразует наборы символов в текстовые узлы, вычисляет выражения, рекурсивно обрабатывает вложенные элементы и формирует новый узел-элемент с вложенными узлами-элементами, узлами-атрибутами и текстовыми узлами.
    Каждое выражение после вычисления даст последовательность узлов и/или атомарных значений. Для узлов из этой последовательности конструктор создаст точную копию со всеми их узлами-потомками, узлами-атрибутами, углами пространств имен, если они есть. Для каждой подпоследовательности идущих подряд атомарных значений конструктор создаст один текстовый узел, содержащий строковые представления атомарных значений с пробелом между ними.
    В полученной после этого новой последовательности нет атомарных значений, а есть только узлы.
    Затем все содержимое конструируемого элемента представляется одной последовательностью узлов, составленной из текстовых узлов конструктора, последовательностей, полученных после вычисления и преобразования выражений, и вложенных узлов-элементов, полученных после рекурсивной обработки вложенных в конструктор элементов. В этой последовательности не должно быть корневых узлов документа, а все узлы-атрибуты должны находиться в начале последовательности. Если эти условия не выполнены, то конструктор выдаст сообщение об ошибке и прекратит работу. Если же они выполнены, то конструктор сделает еще один шаг: он сольет все идущие подряд текстовые узлы, не оставляя между ними пробелов, в один текстовый узел.
    После этого прямой конструктор создает узел-элемент с узлами-потомками из последовательности, полученной на предыдущем шаге.
    В атрибутах конструктора тоже можно записать выражения в фигурных скобках, например:

    Выражение вычисляется, каждый элемент полученной последовательности представляется строкой, а строки разделяются пробелами. Кроме выражений, значение атрибута может содержать наборы символов, которые сцепляются со строками, полученными из выражений, без всяких пробелов:


    Простые указатели

    Простой указатель представляет собой имя типа NCName языка XSD, состоящее из букв, цифр, точек, дефисов и знаков подчеркивания. Имя должно начинаться с буквы. Как обычно в XML, указатель вписывается в любом атрибуте-идентификаторе типа ID, который может содержаться в любом элементе документа XML. Например:
    Содержимое элемента
    Атрибут-указатель в примере myid обязательно должен быть объявлен при описании схемы документа. Объявить его следует с типом ID.

    направляемый фильтром

    Шаг, направляемый фильтром, использует вместо оси и теста узла первичное выражение:
    Первичное выражение[Предикат]
    Первичное выражение выдает в качестве результата последовательность узлов и/или атомарных значений, которая затем фильтруется предикатом.
    Первичное выражение - это:
  • число типа xs:integer, xs:decimal, xs:double;
  • строка символов типа xs:string;
  • значение переменной, начинающееся со знака доллара $;.
  • вызов функции;
  • наконец, произвольное выражение, заключенное в скобки.

  • Поэтому на шаге, направляемом фильтром, можно применять любое выражение, надо только заключить его в скобки.

    направляемый осью поиска

    Шаг, направляемый осью поиска, состоит из трех частей: оси поиска, теста узла и необязательного предиката. Ось отделяется от теста узла двумя двоеточиями, а предикат записывается после теста узла в квадратных скобках:
    ось: текст узла [предикат].
    Например, шаг поиска может выглядеть так:
    child::section[l]
    В этом примере ось поиска child показывает, что поиск охватывает все узлы, непосредственно вложенные в просматриваемый узел, за исключением узлов-атрибутов и узлов пространств имен, текст узла section выбирает из этих узлов узлы-элементы section, а предикат 1 выбирает первый из встреченных узлов-элементов section.
    Каждая из трех частей шага поиска сужает первоначальную область поиска.
    Ось поиска задает направление поиска, отсчитываемое от текущего узла, и его объем. Например, поиск может идти в сторону вложенных элементов или, наоборот, просматривать родительские узлы. Можно просматривать только атрибуты элементов или только соседние элементы.
    Текст узла выбирает в области поиска, заданной осью, определенные узлы по их имени или типу.
    Предикат содержит условия, по которым проверяет узлы, уже отобранные осью поиска и тестом узла, и делает окончательный выбор.

    Схема element()

    Схема element() реализует потребность ссылаться на элемент документа XML примерно в таком стиле: "сослаться на второй абзац третьего параграфа договора №5". Реализация очень проста и выглядит следующим образом:
    element(/1/3/2)
    В этом примере начальная наклонная черта и единица показывают, что отсчет начинается с корневого элемент. В нем выбирается третий по счету непосредственно вложенный элемент. В этом элементе выбирается второй по счету вложенный в него элемент.
    Запись вида /1/3/2 называется последовательностью вложений. Она напоминает запись пути к файлу. Наклонная черта отмечает вложенный элемент подобно вложенному каталогу файловой системы, но вместо имени вложенного каталога или файла стоит натуральное число. Число, записанное за наклонной чертой, показывает порядковый номер непосредственно вложенного элемента. Отсчет элементов начинается с 1.
    Поскольку в хорошо оформленном документе XML может быть только один корневой элемент, последовательность вложений обычно начинается с наклонной черты и единицы: /l. За следующей наклонной чертой перечисляются элементы, непосредственно вложенные в корневой элемент и т. д.
    Перед последовательностью вложений может стоять простой указатель. В этом случае вложения отсчитываются не от корневого элемента, а от элемента, помеченного этим указателем. Применяя простой указатель, предыдущий пример можно записать так:
    element (sect3a/2)
    Наконец, данные в схеме element () могут состоять только из простого указателя:
    element (sect3a)
    Это эквивалентно написанию простого указателя без всякой схемы.

    Схема xpointer()

    Схема xpointer() использует для создания указателей и ссылок на них мощные средства адресации элементов и других частей документа, предоставляемые языком XPath. В схеме xpointer() данными, записываемыми в скобках, могут служить любые выражения, допускаемые в языке XPath, а также их расширения, введенные в язык XPointer.

    Символ

    Для каждого символа документа, не являющегося символом разметки, должен быть информационный пункт символа (обратите внимание - один информационный пункт для каждого отдельного символа). На практике расположенные рядом символы объединяют в строки или конструкции текста, а не перечисляют по отдельности (в соответствии со спецификацией W3C Infoset, это допустимо).
    Информационные пункты символов содержат свойства:
  • Код символа в соответствии со стандартом ISO 10646 (Unicode).
  • Флаг, показывающий, является ли символ пустым пространством внутри содержания или нет. Проверяющие на допустимость анализаторы должны всегда устанавливать этот флаг; не проверяющие на допустимость при желании могут установить этот флаг равным false.
  • При желании разработчик может указать, был ли этот символ включен как часть предопределенной сущности XML.


  • Создание банка ссылок

    При создании какого-либо документа на языке HTML, назовем его для определенности doc.html, в него вставляются гиперссылки на предыдущие, ранее созданные, документы и изображения. Пусть эти ресурсы лежат в файлах oldl.html, old2.html, imgl.gif. Через некоторое время появляются новые документы, назовем их newl.html, new2.html, на которые необходимо сослаться из документа doc.html. Для этого придется отыскать файл doc.html и внести в него новые ссылки. Это очень неудобно. Не говоря уже о том, что файл doc.html может быть недоступен, его уже могли скопировать на множество сайтов. Придется вносить изменения во все копии, что совершенно невозможно.
    Язык XLink, в котором можно сделать ссылки и в прямом, и в обратном направлении, позволяет создать обратные ссылки из новых документов на старый документ. Но это не лучший выход из положения, потому что старый документ при каждом открытии должен отыскать и просмотреть новые документы в поисках этих ссылок. Это требует времени и знания тех адресов, где лежат эти новые документы.
    К счастью, язык XLink предлагает другой, более удобный выход из этой ситуации. Мы выносим все ссылки в отдельный файл - "банк ссылок" - и в случае необходимости изменяем ссылки только в этом файле. Все документы, которым нужны ссылки, обращаются за ними в банк ссылок.

    Создание ссылок на языке XLink

    Язык XLink позволяет создать ссылку в одном, а использовать в других документах. Ссылка может указывать сразу на несколько документов. Сослаться можно не только на документ XML, но и на любой информационный ресурс: изображение, чертеж, программу. Можно организовать ссылку, связывающую другие документы, например, ссылка, записанную в документе docl.xml, может установить связь между документом doc2.xml и документом doc3.xml. Кроме того, язык XLink отмечает направление ссылки и позволяет организовать обратные ссылки. Эти возможности делают язык XLink чрезвычайно мощным, способным удовлетворить нужды самого привередливого разработчика.
    Пространство имен языка XLink
    Интересная особенность языка XLink заключается в том, что он не вводит новые элементы, а определяет только атрибуты, которые можно использовать в любых определяемых вами элементах. Каждый элемент в документе XML, использующий атрибуты языка XLink, становится ссылкой. Атрибуты введенные языком XLink, находятся в пространстве имен http://www.w3.org/1999/xlink. Как обычно, перед использованием атрибутов надо связать это пространство имен с каким-либо префиксом. Очень часто этот префикс называется xlink

    Всего в языке XLink объявлено десять атрибутов:
  • атрибут type задает тип ссылки;
  • атрибут href описывает адрес ресурса, с которым связана ссылка;
  • атрибут show определяет способ показа полученного по ссылке ресурса;
  • атрибут actuate устанавливает момент активизации ссылки;
  • атрибуты label, from, to отмечают и указывают начальные и конечные пункты ссылки;
  • атрибуты role, arcrole, title объясняют смысл ссылки.

  • Разумеется, кроме атрибутов языка XLink в объявляемых элементах-ссылках можно объявлять и любые другие атрибуты.

    Ссылка на пропущенную сущность

    Информационный пункт ссылки на пропущенную сущность должен быть определен для каждой ссылки на сущность, которая либо не была интерпретирована анализатором, не осуществляющим проверку на допустимость, либо в связи с тем, что декларация неизвестной сущности не была прочитана (например, вследствие недоступности), либо потому, что анализатор не включает внешние анализируемые сущности.
    У информационных пунктов ссылок на неизвестные сущности имеются следующие свойства:
  • Имя сущности, на которую ссылаются.
  • По желанию разработчика можно включить также информационный пункт ссылки на сущность для неразвернутой внешней анализируемой сущности, если анализатор прочитал декларацию.


  • Сущность

    Не анализируемые внешние сущности должны быть представлены в виде информационных пунктов сущностей. Для каждой другой сущности в документе также может существовать информационный пункт объекта. Если сущность была объявлена несколько раз, для создания информационного пункта сущности используется только первая ее декларация.
    Информационные пункты сущностей содержат такие свойства:
  • Тип сущности (внутренняя параметрическая сущность, внешняя параметрическая сущность, внутренняя общая сущность, внешняя общая сущность, не анализируемая сущность, сущность документа или внешнее подмножество DTD).
  • Имя сущности. Равно неопределенному значению (null), если информационный пункт сущности представляет собой сущность документа или вешнее определение DTD.
  • Системный идентификатор сущности. Для внутренних сущностей это свойство равно null; для сущности документа оно может быть равно null, а может содержать системный идентификатор документа.
  • Общий идентификатор сущности, если он есть. Для внутренних сущностей равен null.
  • Если сущность является не анализируемой, то ссылка - на информационный пункт нотации. Для других типов сущностей равен null.
  • Базовый идентификатор URI сущности. Если сущность является внутренней, то значение этого идентификатора должно быть равно null
  • По желанию разработчика можно включить текст сущности, если это внутренняя сущность.
  • По желанию разработчика можно включить также название кодировки символов, в которой выражена сущность.
  • Можно включить также указание на статус автономности сущности. Допустимы значения "yes", "no" и "not present".


  • Связи и запросы

    Для того чтобы язык XML мог полностью задействовать свой потенциал, необходимо иметь способ реализации ссылок между документами XML, указатели на них и запросы к ним.
    В связи с тем, что в документах XML сохраняется все 6ольше информации, возникает необходимость в разработке способа получения структурированного доступа к этой информации. Также необходимы способ определения связей между частями документов и обращения к фрагментам (или ресурсам) внутри документов, которые связаны с другими ресурсами. Эти ресурсы могут быть фрагментами как того же, так и других документов, или вовсе не относиться к формату XML.

    Указатели, основанные на схеме

    Указатели, основанные на схеме, состоят, как и следует из их названия, из одной или нескольких схем, записанных через пробелы. Вот пример:
    xpointer(/book/chapter/section) element (color/3)
    В этом примере указатель состоит из двух схем. Первая схема задает ссылку на элемент section, вложенный в элемент chapter, который, в свою очередь, вложен в коневой элемент book.
    Вторая схема ссылается на третий по счету элемент из всех непосредственно вложенных в помеченный простым указателем color элемент.

    Уточненные ссылки XPointer

    Язык XLink позволяет организовать только внешние ссылки на информационный ресурс. Они не могут сослаться на определенное место удаленного документа или на какое-то произвольное место того документа, в котором они записаны. Такие ссылки могут быть полезны, поскольку очень часто в документах нужно организовать ссылку на определенное место того же самого документа, скажем, при создании оглавления, предметного указателя, глоссария.
    В языке HTML <а>. В нем атрибутом href указывается метка того места документа, на которое мы хотим перейти. Перед меткой ставится символ "решетка" #.
    Например: Пункт оглавления
    В том месте документа, на которое мы хотим перейти, записывается тег <а> с атрибутом name и той же меткой:

    Подобную метку можно записать в удаленном документе, допустим, в файле remfile.html, и ссылаться на нее следующим образом:
    Пункт оглавления
    Браузер загрузит документ remfile.html и покажет ту его часть, в которой записан элемент.

    Аналогичная конструкция, разумеется, есть и в XML. По правилам XML метки создаются с помощью атрибутов типа ID, которые можно объявить в любом элементе.
    Ссылки на помеченные элементы указываются атрибутами типа IDREF или IDREFS, которые тоже можно объявить в любом элементе. Проверяющий анализатор, просматривая документ XML, следит за соответствием меток и ссылок на них, отмечая как ошибку ссылку на несуществующую метку. Знак решетки # в ссылках записывать не нужно, сам тип IDREF показывает, что значение атрибута - ссылка.
    Предыдущий пример, переписанный по правилам XML, будет выглядеть следующим образом. Ссылку на помеченный элемент можно записать в виде:
    ????? ?????????? ? ???????? ??????? ????? ???: ?????????? ????????? item ? ch ?? ????? XSD ????? ????? ???:

    Эта простая конструкция языка XML очень скоро перестала удовлетворять разработчиков документов XML. Им потребовалось ссылаться:

  • на определенную точку - букву, символ, позицию - внутри элемента;
  • на множество точек, выбранных по образцу, скажем, на каждое появление в тексте слова "монитор";
  • не на определенный элемент или точку внутри элемента, а на какую-то часть документа, границы которой не совпадают с началом и концом элемента;
  • на что-нибудь вроде "третьего абзаца пятого параграфа предыдущей версии документа".


  • Кроме того, не всегда возможно расставлять в элементах атрибуты типа ID. В конце концов, документ не всегда доступен, или у разработчика просто может отсутствовать право записи в документ, на который надо сослаться.

    Следуя духу XML, консорциум W3C создал для записи таких уточненных ссылок и меток язык XPointer. Общую структуру языка описывает рекомендация "XPointer Framework".

    XPointer не является реализацией XML. Он не определяет никакие типы данных и не объявляет элементы и атрибуты. Он задает только правила записи меток и обращения к ним с помощью ссылок языка XLink.

    На языке XPointer метки называются указателями. XPointer определяет два вида указателей: простые указатели и указатели, основанные на схеме. Рассмотрим подробнее каждый из этих видов.

    Узлы дерева

    Язык XPath различает семь видов узлов.
  • Узлы документа. Не отождествляйте узел документа с узлом корневого элемента документа. Узел корневого элемента вложен в узел документа наряду с узлами-комментариями и узлами инструкции по обработке. Кроме того, в языке XPath предусмотрена возможность работы с другими типами документов, возможно, содержащими несколько корневых элементов. Имя узла документа совпадает с именем корневого элемента документа.
  • Узлы-элементы. Имя узла-элемента состоит из идентификатора пространства имен, получаемого по префиксу уточненного имени элемента, и локального имени элемента. Это расширенное имя узла. Если у элемента есть атрибут типа ID, то он служит идентификатором узла.
  • Узлы-атрибуты. Их предок - узел-элемент, к которому относятся атрибуты, хотя они не считаются потомками этого узла. Узел-атрибут тоже определяется расширенным именем, полученным из уточненного имени атрибута.
  • Узлы пространств имен. С каждым узлом-элементом связаны узлы тех пространств имен, в область действия которых входит данный элемент. Так же как и узлы-атрибуты, они не считаются потомками узла-элемента, хотя считают его своим предком. Поэтому программа-анализатор, обходя дерево, не будет автоматически просматривать узлы пространств имен. Имя узла пространства имен - это префикс, связанный с ним.
  • Узлы инструкций по обработке. Это отдельные узлы, имена которых - это имена целевых приложений, выполняющих инструкцию. Первая строка пролога документа XML не считается инструкцией по обработке и не входит в дерево документа.
  • Узлы комментарии. Каждый комментарий заносится в дерево как узел без имени.
  • Текстовые узлы. Это строка символов, записанная в теле элемента между вложенными элементами. У текстовых узлов нет расширенного имени.

  • Узел любого вида можно представить строкой символов. Для каждого вида узла правила представления свои, они перечислены далее.
  • Строка, представляющая узел документа или узел-элемент, состоит из всех строк, представляющих его узлы-потомки текстового вида.
  • Строка, представляющая узел-атрибут, содержит его значение.
  • Строка, представляющая узел пространства имен, содержит его строку URI.
  • Строка узла инструкции по обработке составлена из ее содержимого.
  • Узел-комментарий и текстовый узел сами являются строками, причем начальные символы комментария в строку не входят.


  • Важность проекта Information Set

    Все эти информационные пункты и свойства практически идентичны модели DOM. Фактически все различные технологии, определенные консорциумом W3C для доступа к документам XML - XML DOM, XLink, XPath, XPointer, а также XSLT - являются производными от базовой структуры, описанной в спецификации XML Information Set. Чтобы извлечь максимум из предоставляемых этими технологиями функциональных возможностей, необходимо рассматривать документы XML не как потоки текстовой информации, а именно как описанные ранее объекты.
    Несмотря на то, что стандарт подробно описывает соединения между объектами, он не определяет какой-либо конкретной реализации.
    Чтобы использовать различные технологии, определенные консорциумом W3C для доступа к документам XML и манипулирования ими, сначала необходимо изучить определения консорциума W3C в спецификации Infoset. Как только вы перестанете считать документы XML текстом и начнете думать о них как о связанных информационных пунктах, вы обнаружите, что механизмы связывания и запросов для доступа к документам XML становятся очень естественными и интуитивными. В этих технологиях используются пункты информационного набора, описанные в стандарте Infoset; они позволяют манипулировать документами XML и адресовать их, используя представленные в пунктах связи типа "родитель-потомок" для навигации по этим документам.

    Вычисляемый конструктор

    Прямой конструктор использует заданные заранее имена элементов и атрибутов. Иногда это неудобно или невозможно сделать. В таких случаях применяют вычисляемые конструкторы.
    Вычисляемые конструкторы могут создавать узлы четырех видов: узлы-элементы, узлы-атрибуты, корневые узлы документа или текстовые узлы. Поэтому в начале конструктора надо указать вид создаваемого узла одним из слов element, attribute, document или text. После этого слова в фигурных скобках записывается выражение, конструирующее узел. Для узла-элемента и узла-атрибута нужно еще записать его имя, которое тоже можно задать выражением. Вычисляемый конструктор <

    Выражения, определяющие путь

    Чаще всего выражение языка XPath показывает путь к определяемому участку документа XML, начинающийся в корневом узле документа или каком-то начальном узле. Такие выражения состоят из нескольких шагов поиска, выполняемых последовательно слева направо. Последовательность, полученная на предыдущем шаге, передается следующему шагу, который использует ее как исходный материал для поиска. Шаги в выражении разделены наклонными чертами. Например, выражение
    /contract/section/paragraph
    состоит из трех шагов поиска, содержащих имена элементов contract, section и paragraph. В результате вычисления первого шага этого выражения получится последовательность узлов, вложенных в узел документа contract. На втором шаге из этой последовательности выбираются узлы section, на третьем - узлы paragraph. В результате вычисления всего выражения получается последовательность узлов, состоящая из всех элементов paragraph, вложенных в элементы section, которые, в свою очередь, вложены в элементы contract.
    В общем случае шаг поиска устроен гораздо сложнее. Язык XPath 2.0 различает два вида шагов поиска: шаг, направляемый осью поиска, и шаг, направляемый фильтром. После выполнения шага, направляемого осью, получается последовательность узлов, а после выполнения фильтра в последовательности кроме узлов могут встретиться атомарные значения.

    XML Information Set

    Проект The XML Information Set, или Infoset, - рабочий проект W3C описания различных фрагментов информации, составляющих правильно оформленный документ XML.
    Целью проекта является создание общего словаря для описания содержания документов XML. Любой процессор XML, возвращающий информацию о содержании документа XML, будет описывать содержание в терминах данных информационных пунктов.

    Языки информационного обмена

    Декларация xsl:function

    Элемент xsl:function позволяет описывать самые настоящие пользовательские функции. Имя функции записывается в обязательном атрибуте nаmе, (аргументы функции задаются элементами xsl:param, а тело функции - это конструктор последовательности, записанный в содержимом элементе xsl:function. Результатом функции будет последовательность, созданная конструктором. Тип функции можно указать необязательным атрибутом аs.
    Имя функции - это уточненное имя типа QName, причем оно должно обязательно записываться с префиксом.
    Все аргументы функции позиционные, следовательно, все элементы xsl:param должны быть записаны в начале тела функции и порядок их записи имеет значение при вызове функции. У аргументов функции не может быть значений по умолчанию, следовательно, элементы xsl:param должны быть пустыми и у них не должно быть атрибутов select. Например:

    вызвать функцию можно в любом выражении подходящего типа, записав ее имя и аргументы в скобках. Например:
    <хsl:value-of select="10 + 2 * usr:sum(2, 3)" />
    Функция может вызываться рекурсивно.

    Декларация xsl:import

    Элемент xsl:import записывается очень просто:
    <хsl:import href="адрес URI таблицы стилей" />
    Его можно записать только непосредственно в корневом элементе xsl:stylesheet и только в самом начале таблицы стилей. Элементов xsl: import может быть несколько.
    Процессор XSLT отыскивает таблицу стилей по указанному атрибутом href адресу и подставляет ее на место элемента xsl:import перед преобразованием.
    Некоторые правила преобразования из таблиц, импортируемых элементами xsl:import, могут конфликтовать с правилами, импортированными из других таблиц или определенными в самой таблице стилей. В таком случае чаще всего применяются те правила, которые записаны последними. Поэтому порядок записи элементов xsl:import в таблицу стилей имеет большое значение.

    Декларация xsl:include

    Второй элемент, включающий внешние таблицы стилей в данную таблицу, - это элемент xsl:include. Он записывается точно так же, как элемент xsl:import, и оказывает такое же действие:

    Его можно записать не только непосредственно в корневом элементе xsl:stylesheet, но, в отличие от элемента xsl:import, в любом месте таблицы стилей. Второе отличие от элемента xsl:import заключается в том, что порядок записи элементов xsl:include в таблице стилей не имеет значения.

    Декларация xsl:param

    Элемент xsl:param записывается или непосредственно в элементе xsl:stylesheet, чтобы задать параметр преобразования, или в элементе xsl:template, чтобы задать параметр правила, или в элементе xsl:function как аргумент функции. У него один обязательный атрибут name, определяющий имя параметра. Кроме него, часто присутствует необязательный атрибут select, в котором записывается выражение для получения значения параметра:

    Если атрибут select отсутствует, то значение параметра берется из содержимого элемента, которым может быть конструктор последовательности узлов и атомарных значений:
    10
    Если отсутствует и атрибут select, и содержимое элемента, то параметр получает значение пустой строки.
    Дли получении значения параметра надо записывать его имя со знаком доллара: $p1,$p2. Например:

    Правила, определяющие область видимости параметров, такие же, как и у имен объектов, определенных декларацией xsl:variable.
    Еще один необязательный атрибут as содержит желательный тип, к которому будет приведено значение параметра.
    Наконец, последний атрибут required, принимающий значения yes или nо (по умолчанию), указывает обязательность параметра. Если параметр обязателен, required="yes", то элемент xsl:param должен быть пустым и не содержать атрибут select. В таком случае он получит определенное значение при вызове функции или элементом xsl:with-param при вызове шаблона.

    Декларация xsl:template

    Элемент xsl:template определяет шаблонное правило преобразования. Своим атрибутом match он задает образец для отбора узлов, подлежащих преобразованию, а в теле содержит конструктор последовательности узлов и атомарных значений, которая и будет результатом преобразования отобранных по образцу узлов.
    Конструктор
    Каждый из атрибутов match и name не обязателен, но хотя бы один из них должен присутствовать.
    Атрибут match содержит образец для отбора преобразуемых узлов.
    Атрибут name определяет имя шаблона. Имя шаблона - это обычное уточненное имя XML типа QName. Шаблон можно вызвать по имени элементом xsl:call-template, а если он не содержит атрибута match, то такой вызов обязателен, поскольку неизвестны узлы, к которым его надо применить, и он не будут применяться автоматически. Очень часто именованный шаблон содержит параметры, заданные элементами xsl:param, и вызывается с различным параметрами совсем как обычная функция.
    У элемента xsl: template могут быть дополнительные атрибуты mode, as, priority.
    Атрибут mode определяет режим обработки.
    Атрибут as указывает желаемый тип результата (полученная последовательность будет приведена к этому типу).
    Атрибут priority назначает правилу приоритет, который будет учитываться при отборе правил, применимых к некоторому узлу.
    При вызове именованного шаблона элементов xsl:call-template атрибуты match, mode и priority игнарируются.
    Если у именованного шаблона нет атрибута match, то у него не должно быть и атрибутов mode и priority, в них просто нет никакого смысла.

    Декларация xsl:variable

    Элемент xsl:variable определяет имя объекта. Оно записывается обязательным атрибутом name. Имя объекта должно быть уточненным именем XML типа QName. Кроме того, атрибутом select переменной можно задать сам объект, а атрибутом as определить тип объекта. Например:

    Имя var1 будет хранить число элементов person. Объект может быть получен из содержимого элемента xsl: variable:
    10

    или создан конструктором последовательности:

    Если объект не получен из атрибута select или содержимого элемента xsl: variable, то по умолчанию имя связывается с пустой строкой.
    Для того чтобы получить объект, связанный с именем, определенным элементом xsl: variable, перед именем надо поставить знак доллара: $varl, $var2. При этом следует учитывать область действия имени.
    Область действия имени простирается на весь элемент, в котором оно определено, начиная с места определения и включая вложенные элементы, если только в них не определено то же самое имя.
    Имена, определенные непосредственно в корневом элементе xsl:stylesheet, называются глобальными именами, остальные - локальными именами.
    Хотя слово "variable" и переводится с английского языка как "переменная", имя, созданное элементом xsl: variable - это не имя переменной, его значение нельзя изменить. Это только название некоторого объекта, которое удобно использовать в тех случаях, когда объект надо использовать во многих местах таблицы стилей, а его вычисление сложно или громоздко.

    Динамические трансформации

    В предыдущем разделе было описано представление одних и тех же данных различными способами, и при этом все участники требовали конкретных статических версий документов XML. Однако иногда возникает необходимость в более динамической трансформации. Например, в электронных таблицах часто в ответ на щелчок мышью на заголовке столбца требуется отсортировать данные. Для этого нужны более динамичные трансформации.
    Любая трансформация, требующая действий пользователя или создающая интерактивные документы, может представлять собой задачу, совершенно не похожую на создание статических документов. В ходе динамических трансформаций часто приходится осуществлять обработку событий, требующую использования языка программирования.
    Такие трансформации можно осуществлять и без помощи XSL, используя языки сценариев и модель DOM, а модель DOM можно применять в браузерах благодаря ее совместимости с языками JavaScript, Java, C++, Perl, Visual Basic или Python. Поэтому часто при осуществлении трансформаций обходятся только моделью DOM и языками сценариев (без XSL).

    Функции id() и key()

    Образец может начинаться с вызова функции id() или функции key(). Единственным аргументом функции id() служит уникальный идентификатор узла, т.е. значение его атрибута типа ID. Например, образцу id(@xref) соответствует узел-элемент, на идентификатор которого ссылается значение атрибута xref. Образцу id() соответствует узел-элемент с идентификатором h12, а образцу id()//street - его потомки street любого уровня вложенности.
    Функция id(), работающая с атрибутами типа ID, подвержена всем ограничениям этого типа, а именно:
  • у элемента может быть только один атрибут типа ID, значит, можно cссылаться только на этот атрибут, не говоря уже о том, что такой атрибут может вообще отсутствовать:
  • значение атрибута типа ID уникально, значит, нельзя обратиться сразу к нескольким элементам;
  • значение атрибута типа ID может быть только именем типа Name, значит, не может быть числом, содержать пробелы и многие другие символы;
  • схема, в которой определен тип ID атрибута, может оказаться недоступной для процессора XSLT и он не "узнает" тип атрибута;
  • функция id() работает только с атрибутами, но не с элементами, их содержимым и прочими узлами дерева документа;
  • для внесения новых перекрестных ссылок в документ XML надо его менять, вставляя атрибуты типа ID, что может быть нежелательно или невозможно.

  • Функция key() менее требовательна. Она снимает ограничения функции id(), обращаясь не к атрибуту элемента, находящегося в документе ХМL, а к атрибуту use специального элемента xsl:key, расположенного в таблице стилей. У нее два аргумента:
  • имя ключа, задаваемое строкой типа QName; это значение атрибута name элемента xsl:key, позволяющее выбрать нужный элемент xsl:key.
  • значение ключа, представляющее собой выражение, в результате вычисления которого получается последовательность из одного или нескольких атомарных значений типа xdt:anyAtomicType.

  • Образец с функцией key() выглядит примерно так: key("addr", 230007)//street.
    Элемент xsl:key определяет ключ и множество значений, а функция key() выбирает из этого множества те значения, что совпадают со вторым аргументом функции key(). Таким образом, при необходимости создания новых ссылок в исходном документе XML, его не надо изменить, достаточно добавить новые элементы xml:key в таблицу стилей.

    Функции процессора XSL

  • Во-первых, процессор строит рощу, являющуюся внутренним представлением документа. Эта роща всегда имеет корневой элемент, представляющий собой весь документ XML, а не его элемент верхнего уровня. Ниже корневого элемента расположена вся иерархия узлов. Каждый узел типизирован. Например, он может быть предназначен для определения DTD, для схемы или для команды обработки. Если элемент содержит атрибуты, то у каждого элемента также имеется коллекция узлов атрибутов. Если элемент содержит данные, то в узел элемента вкладывается еще и соответствующие им узел. Таким образом, потомками узла элемента может быть коллекция узлов атрибутов и узел данных.
  • Во-вторых, создает структуру для документа XSLT. Она также может представлять собой рощу, но может быть структурой любого типа, оптимизированной для обработки шаблонов и соответствия образцов.
  • Затем каждый раз, встретив элемент , формирует список узлов и продолжит работу с этим списком. Если элемент содержит атрибут select, список узлов формируется на основе указанного запроса XPath. В противном случае список содержит все дочерние узлы.
  • Каждый раз, встретив конструкцию , процессор извлекает значение из исходного дерева, основываясь на выражении XPath ее атрибута select.
  • Трансформация не ограничивается только трансляцией типа один-к-одному: она позволяет добавлять новое информационное содержание, добавлять и удалять элементы, а также осуществлять трансляции типа один-ко-многим.


  • Инструкции управления xsl:if, xsl:for-each, xsl:choose

    Элемент xsl:if запускает конструктор последовательности, содержащийся в его теле, только если истинно выражение, записанное в обязательном и единственном атрибуте test:
    больше
    У элемента xsl:for-each в обязательном и единственном атрибуте select записывается выражение, дающее в результате последовательность. Для каждого члена этой последовательности выполняется конструктор, содержащийся в теле элемента xsl:for-each. В результате получается цикл, выполняющийся столько раз, сколько элементов у последовательности, полученной в результате вычисления выражения атрибута select.
    У элемента xsl:choose нет ни одного атрибута, но в его теле записывается один или несколько элементов xsl: when и один необязательный элемент xsl:otherwise:
    Понедельник
    Bторник Cреда Четверг Пятница Cyббота Воскресенье Ошибка определения дня нeдeли
    У элемента xsl:when есть только один обязательный параметр test, содержащий логическое выражение, и тело, содержащее конструктор последовательности.
    Элемент xsl: otherwise не имеет атрибутов, у него есть только тело, содержащее конструктор последовательности.
    В инструкции xsl: choose всегда выполняется не больше одного варианта, Варианты xsl:when просматриваются в порядке их написания в инструкции xsl:choose. Как только будет найден вариант с истинным значением выражения test, он будет выполнен, и результат этого варианта будет результатом всей инструкции. Варианты, следующие за ним по порядку, не рассматриваются. Если ни один вариант не подойдет, то результатом инструкции будет результат конструктора, записанного в элементе xsl:otherwise. Если элемента xsl:otherwise в инструкции нет, то результатом будет пустая строка.

    Инструкция xsl:apply-templates

    Элемент xsl:apply-templates, записываемый чаще всего внутри элемента xsl: template, в простейшем виде пуст:

    Он предписывает обработать рекурсивно все узлы-потомки узлов, отобранных родительским элементом xsl:template.
    У элемента xsl:apply-templates есть необязательные атрибуты select и mode.
    Атрибут select, значением которого должно быть выражение, дающее последовательность узлов, ограничивает обработку только указанными в нем узлами.
    Атрибут mode выбирает режим обработки из режимов, уже определенных в элементах xsl:template. Режим - это любое имя типа QName, но два режима предопределены. Это текущий режим, отмечаемый словом #current, и режим по умолчанию, принимаемый при отсутствии атрибута mode, или отмечаемый явно словом #default.
    Содержимым элемента xsl: apply-templates могут служить элементы xsl:sort и xsl:with-param.

    Инструкция xsl:for-each-group

    Элемент xsl:for-each-group отбирает последовательность узлов и атомарных значений своим обязательным атрибутом select и группирует ее элементы по признаку, заданному выражением, записанным в атрибуте group-by. Этот признак называется ключом группы. Ключ группы вычисляется заново для каждого элемента последовательности. В результате исходная последовательность, отобранная атрибутом select, разбивается на несколько последовательностей. В следующем примере в одну группу собираются все узлы-элементы name с одинаковым значением атрибута surname:

    Выражение, являющееся значением атрибута group-by, может давать несколько ключей группы, и один узел может попасть сразу в несколько групп. Например:

    Второй способ разбить последовательность на группы дает атрибут group-adjacent. Он собирает в группу все подряд идущие элементы последовательности с одинаковым значением ключа. Такой отбор возможен, если в атрибуте group-adjacent содержится только один ключ группы. Процессор XSLT следит за тем, чтобы значением атрибута group-adjacent был один и только один ключ группы.
    Третий и четвертый способы применимы к последовательностям, состоящим только из узлов, без атомарных значений. Эти способы применяют атрибут group-starting-with или атрибут group-ending-with. Значением этих атрибутов может быть не любое выражение, а только образец. В одну группу собираются все подряд идущие узлы, первый (последний) из которых удовлетворяет образцу. Остальные узлы из этой группы не будут удовлетворять образцу. Если несколько подряд идущих элементов последовательности удовлетворяют образцу, то они попадут в разные группы.
    Итак, группы узлов создаются одним из четырех атрибутов элемента xsl:for-each-group: group-by, group-adjacent, group-starting-with, group-ending-with. В каждом элементе xsl:for-each-group должен быть один и только один из этих атрибутов. Полученные группы существуют и могут использоваться только в содержимом элемента xsl:for-each-group. В теле элемента xsl:for-each-group записывается конструктор последовательности, который выполняется по одному разу для каждой группы.
    Для удобства работы с группами в язык XSLT введены функции current-group() и current-group-key ().Их можно использовать только в теле элемента xsl:for-each-group. У обеих функций нет аргументов. Результатом функции current-group() будет последовательность- текущая группа, а результатом функции current-group-key() - значение ключа текущей группы.

    Инструкция xsl:value-of

    Элемент xsl:value-of вычисляет выражение, записанное в его обязательном атрибуте select, и преобразует его в строку. Например, выше мы определили имя объекта var2. Чтобы получить значение объекта var2, надо записать:

    Если в результате вычисления выражения получается последовательность, то процессор XSLT версии 1.0 выберет из нее только первый элемент, преобразованный в строку.

    Элемент xsl:with-param

    Элемент xsl:with-param ссылается на некоторый параметр, имя которого записано в обязательном атрибуте name. Необязательным атрибутом select можно задать выражение, результат вычисления которого будет новым значением параметра:

    Новое значение можно задать и в содержимом элемента:
    100
    Элемент xsl:with-param используется только в инструкциях xsl:apply-templates, xsl:apply-imports, xsl:call-template.

    Элементы, объявленные в XSLT

    Язык XSLT объявляет около полусотни элементов. Из них 17 элементов верхнего уровня, которые могут быть непосредственно вложены в корневой элемент xsl:stylesheet таблицы стилей. Они называются декларациями. Это элементы xsl: import, xsl: include, xsl: attribute-set, xsl:character-map, xsl:date-format, xsl:decimal-format, xsl:function, xsl:import-schema, xsl:key, xsl:namespace-alias, xsl:output, xsl:param, xsl:preserve-space, xsl:sort-key, xsl:strip-space, xsl:template, xsl:variable. Более того, все эти элементы, кроме xsl:param и xsl: variable, можно записывать только на верхнем уровне вложенности, непосредственно в корневом элементе xsl:stylesheet.
    Кроме элементов верхнего уровня вложенности, в языке XSLT объявлено более тридцати элементов, которые можно записывать в теле элементов верхнего уровня. Наиболее часто применяются элементы xsl:apply-templates, xsl:value-of, xsl:copy-of, xsl:sort, xsl:text.
    Из всех элементов XSLT не верхнего уровня вложенности выделяются инструкции. Не путайте инструкции XSLT и инструкции по обработке XML. Формально инструкции XSLT определяются как элементы, которые можно вставлять в конструктор последовательности. К инструкциям, в частности, относятся элементы, создающие узлы всех семи видов и последовательности узлов. Это элементы xsl:element, xsl:attribute, xsl:text, xsl:comment, xsl:processing-instruction, xsl:namespace, xsl:result-document, xsl:sequence.
    Кроме них, инструкциями считаются элементы xsl:apply-templates, xsl: value-of, xsl: variable и др., всего более двадцати элементов. К инструкциям относятся как элементы, управляющие выбором правил преобразовании xsl:if, xsl:for-each, xsl:choose, так и элементы, копирующие узлы xsl:copy, xsl:copy-of.
    Все элементы необязательны и могут располагаться в любом порядке, за одним исключением: декларации xsl:import, если они есть, должны быть записаны первыми.
    Рассмотрим некоторые наиболее часто применяемые элементы XSLT.

    Каким образом процессор XSL трансформирует исходный документ

    Как уже отмечалось, язык XSLT работает не с синтаксисом документа, а с его моделью. Исходный формат и формат назначения являются приложениями XML и подлежащая структура в обоих случаях представляет собой дерево. Кроме того таблица стилей XSL - это документ XML, и потому она также может быть представлена в виде дерева. Итак, процессоры XSLT работают с тремя деревьями.
    Язык XSLT является декларативным, т.е. вы определяете, как должен выглядеть результат, а не как он должен быть трансформирован; именно для выполнения этой работы нужен процессор XSL. Таблица стилей XSL состоит из шаблонов (templates), определяющих, каким образом каждый узел исходного дерева должен быть представлен в дереве результата. Процессор проходит по роще источника, начиная с корня, и ищет соответствующие шаблоны в дереве таблицы стилей. Обнаружив шаблон, он с помощью содержащихся в нем правил записывает абстрактное представление результата в дерево результата. Так он перемещается по документу узел за узлом (это определяется инструкцией XSLT ) и ищет соответствия в таблице стилей. Если соответствующего шаблона не обнаруживается, он переходит к следующему. Можно сказать, что в таком случае он выполняет шаблон по умолчанию, который не приводит к результату на выходе. По завершении работы процессора дерево результата можно транслировать в документ XML, текст, документ HTML или в другую желаемую форму.
    Теоретически события должны происходить в описанной последовательности. Однако в методах создания обработчиков XSLT используются различные вариации. Процессоры XSLT можно оптимизировать, а таблицы стилей не обязательно сохранять в виде рощи или древовидной структуры. Тем не менее описанный подход дает общее представление об их поведении.

    Образцы (patterns)

    Прежде чем сделать преобразование дерева документа XML, из него следует выбрать те узлы, которые подвергнутся тому или иному преобразованию, Их можно выбирать по имени, содержимому, атрибутам и другим признакам. Условия отбора узлов задаются образцом (pattern), записанным в виде одного или нескольких выражений языка XPath 2.0. Выражения, содержащиеся в образце, объединяются вертикальной чертой |, означающей, что выбираемый узел должен удовлетворять хотя бы одному выражению образца. Вместо вертикальной черты можно записывать слово union.
    В образце можно записать не всякое выражение XPath, а только путь, каждый шаг которого определяется осью, причем допускаются только три оси: child (по умолчанию), // и attribute. Это означает, что, находясь в каком-то узле, мы можем "увидеть", кроме него самого, только его атрибуты и узлы-потомки. Обратите внимание на то, что явная запись оси descendant-or-self недопустима, применяется только сокращенная запись //. Запись оси attribute:: можно сократить до одной "собачки" @, а текущий узел очень часто обозначается точкой.
    Хотя образец и строится как выражение языка XPath, но его цель - не отобрать последовательность узлов, а проверить соответствие узла данному образцу. Можно сказать, что некоторый узел Node соответствует некоторому образцу pattern тогда и только тогда, когда узел Node принадлежит последовательности узлов - результату вычисления выражения //Pattern. Например, образцу person//street будут соответствовать все узлы из последовательности //person//street, а именно все узлы street, вложенные в узлы-элементы person даже через несколько промежуточных узлов.
    Надо сразу же отметить, что перечисленные ограничения касаются только образцов. В других конструкциях языка XSLT можно применять выражения XPath в полном объеме.

    Причины трансформации XML

    Документ XML, сохраненный в текстовом файле или сгенерированный программой, содержится в фиксированном формате. Хотя XML не зависит от платформы и может передаваться между различными частями приложения в некоторых случаях требуется информация из других структур. Кроме того, может потребоваться трансформировать динамически структуру документа в интерактивный документ, например для того, чтобы привести ее в соответствие запросам пользователя. В общем случае трансформации относятся к одной из трех категорий:
    Структурные трансформации - трансформация одного словаря XML в другой по аналогии с переводом.
    Создание динамических документов - таким способом пользователю предоставляется возможность изменять порядок, сортировать и фильтровать части документа XML, например щелчком на заголовке столбца таблицы изменить порядок ее содержания.
    Трансформации в язык формирования изображения - подготовка документа для визуального представления в какой-либо форме браузера пользователя, например в Wireless Application Protocol (WAP), HTML, VOXML или в формате масштабируемой векторной графики.
    Теперь рассмотрим эти три категории по очереди.

    Различные браузеры

    Многие Web-разработчики затратили огромные усилия и получили головную боль, пытаясь создать параллельные сайты или части сайтов для несовместимых версий браузеров. Мысль о том, что XML применим только в браузерах, понимающих этот язык, предполагает появление еще одной области несовместимости. Однако, разработав содержание сайта на языке XML, можно затем трансформировать его в другие языки разметки, чтобы из одного центрального содержания XML создать несколько версий документов HTML.

    Трансформация документа таблицей стилей

    Язык XSL является приложением XML, так что фактически таблица стилей (т.е. таблица трансформаций) представляет собой документ XML. В связи с этим документ может начинаться с декларации XML, показывающей анализатору, какой версией языка документ закодирован.
    Корневым элементом нашей таблицы стилей является элемент :
    .
    Первым атрибутом этого элемента служит версия XSLT, вторым - атрибут xmlns:xsl, содержащий пространство имен для рекомендации трансформации XSL.
    Этот атрибут декларирует пространство имен ХSLT. С данным пространством связан префикс xsl, так что корневым элементом фактически является элемент , но он квалифицирован префиксом пространства имен xsl:. После объявления пространства имен любой элемент начинающийся с префикса xsl:, входит в состав словаря XSL.
    Элемент содержит три шаблона, каждый из которых вложен в элемент