Дизайн документов XML
Язык XML разделяет данные и правила их представления. Следовательно, языки стилей (style languages) XML должен трансформировать оригинальный документ XML в набор объектов визуализации, предназначенных для систем зрительного или слухового восприятия.
Формирование визуального изображения
Браузеры, способные визуализировать документы XML, легко доступны. Например, это Microsoft Internet Explorer 5 или выше. Он поддерживает как CSS, так и XSL.
Браузеры как и обычный лист бумаги являются субстратами процесса формирования графического изображения. Можно сказать, что оба они представляют собой в основном контейнеры для визуальных объектов форматирования. Простейшей сущностью языков стилей является область. В стандартных языках стилей область представляет собой прямоугольный участок. С учетом этого представления страницей можно назвать область, содержащую другую область. Такие прямоугольные области, содержащие другие прямоугольные области, формируют древовидную структуру. Таким образом, визуальная структура представляет собой дерево объектов форматирования (прямоугольных областей), причем на вершине дерева находится страница, а объекты форматирования более низкого уровня являются ее потомками.
В зависимости от уровня сложности языка стилей предлагаются две основные модели структуры:
Потоковая структура Фиксированная структура
Потоковой называется структура, в которой объекты форматирования располагаются на субстрате (странице или экране) один за другим. Если запись ведется сверху вниз и слева направо, то объекты располагаются точно так же - сверху вниз и слева направо. Например, параграфы текста размещаются вертикально друг под другом, а слова (предложения) - горизонтально. Как правило, объекты форматирования располагаются вертикально или горизонтально. Например, в языке таблицы стилей CSS блоковые объекты располагаются вертикально, как параграфы, а встроенные (inline) объекты - горизонтально, как слова и предложения. Обычно при направлении письма слева направо объекты, располагаемые вертикально, содержат объекты, размещаемые горизонтально.
Фиксированной называется такая структура, в которой объекты форматирования располагаются в указанном месте на странице. В этом случае область, представляющая документ, напоминает декартово пространство, в котором все места могут быть уникально идентифицированы с помощью координат локализации. Например, язык стилей CSS позволяет располагать определенные объекты форматирования в указанном положении, причем свойства left и top означают относительное расстояние от левого и верхнего края границ контейнера. Если контейнер представляет собой документ, то фиксированное положение объекта определяется относительно левой и верхней границ документа. Если контейнер - это область, то фиксированное положение объекта определяется относительно левой и верхней границ области.
Формирование звукового представления
В принципе звуковая модель напоминает модель музыки. Звуки в ней организованы последовательно и имеют определенную продолжительность во времени. Но в отличие от музыки звуки являются более сложными, поскольку каждый звук в данном случае - это произносимое слово. Поэтому атомарной единицей звукового браузера является речь, означающая разговор, состоящий из последовательностей слов, разделенных тишиной. Характеристиками речи являются ее тон, высота звука, ритм и т.д.
Где осуществляется визуализация
Визуализация документа XML может осуществляться на сервере или у клиента. Если браузер клиента - это браузер XML, то перед сервером HTTP стоит очень простая задача: ассоциировать с документом правильную таблицу стилей (документ может уже содержать ее) и отправить ее в браузер. Если же браузер клиента не является браузером XML, то перед отправкой документ нужно трансформировать в отображаемый формат. Трансформация может осуществляться на сервере или у клиента.
Интерактивное поведение
В браузер Internet Explorer 5 и выше компания Microsoft добавила расширения, описывающие поведение. Они усовершенствовали возможности CSS, добавляя такие интерактивные действия, как выделение текста. Поведение можно связать с любым элементом XML. В отличие от документов DHTML документы XML, как правило, не содержат сценариев, так как это не соответствовало бы концепции отделения данных от их представления (или взаимодействия с ними). При связывании с любым элементом XML добавляется интерактивность визуализируемому документу.
Языки, основанные на правилах
Большинство языков стилей основано на правилах. Каждое правило состоит из двух разделов:
Раздел сравнения образцовРаздел действий
Раздел сравнения образцов представляет собой выражение, позволяющее связывать с разметкой некоторое действие.
Раздел действий - это небольшая процедура или шаблон
Процесс, выполняемый на языках стилей, основанных на правилах, предполагает трансформацию оригинального документа XML в древовидную структуру, а затем по очереди узлы дерева просматриваются на предмет соответствия конкретному правилу. При обнаружении соответствия выполняется процедура. Если раздел действия представляет собой шаблон, происходит неявное обращение к правилу или процедуре, анализирующей и выводящей содержание этого шаблона, так как шаблон может содержать и другие элементы, требующие обработки процессором. Фактически весь описанный процесс представляет собой обычный процесс обработчика визуализации XML.
Как ассоциировать таблицу стилей с документом XML
Документы XML ассоциируются с таблицами стилей с помощью команд обработки. Этот специальный тип элемента указывает браузеру или обработчику стилей:
Где найти таблицу стилейНа каком языке написана таблица стилейДля какой среды предназначена таблица стилей Заголовок, отображаемый в меню, если предлагается несколько альтернативных таблиц стилейИмеются ли альтернативные таблицы стилейНапример: <?xml-stylesheet href = "myStyleSheet.css" type = "text/сss" title = "CSS style" media = "screen" ?>
Элементом, связывающим документ XML с таблицей стилей, является команда обработки xml-stylesheet.
У команды обработки имеются атрибуты:
href | Локализация таблицы стилей. Его значение представляет собой URI; но чаще всего используется просто адрес URL. |
type | Язык таблицы стилей, выраженный как тип MIME. Например, типом языка CSS является text/css, языка DSSSL - text/usssl, а языкаXSL- text/xsl. |
media | Целевая среда таблицы стилей. Может принимать значения screen, print, aural и т.д. |
title | Заголовок таблицы стилей. Обработчик таблицы стилей может показывать этот заголовок в меню. |
alternate | Может принимать значения yes и по. Атрибут показывает обработчику, существует ли альтернативная таблица стилей для этой среды. |
Как работает язык XSLF
Как и другие языки, основанные на правилах, документ XSL (XSLT или XSLF) представляет собой коллекцию правил, состоящую из раздела сравнения образцов и раздела действий. На языке XSL эти правила называются шаблонами, так что атомарным элементом таблицы стилей XSL является шаблон. Часть шаблона XSL, осуществляющая сравнение с образцом, называется выражением XPath.
Как только выражение XPath выбрало узел документа, оно связывается с содержанием шаблона. Так как документ XML трансформируется в дерево результата, состоящее из объектов форматирования XSL, возникает необходимость сравнить каждый элемент оригинального документа XML с конкретным шаблоном. Кроме того, при необходимости трансформировать оригинальный документ совместно используется несколько конструкций XSLT и выражений XPath, что позволяет достичь любого узла документа XML, преобразуемого в иерархическую структуру.
Выражение XPath дает возможность достичь любого узла документа. Конструкция XSLT позволяет установить соответствие между узлами и шаблонами, содержащими объекты форматирования XSL.
Чтобы лучше понять процесс, обратимся к внутреннему устройству обработчика XSL.
Процессор XSL создает три дерева:
Исходное дерево, содержащее исходный документ, который надо визуализироватьДерево с таблицей стилей XSLДерево результата, используемое для конструирования получаемого документа
Для каждого шаблона в дереве, содержащем таблицу стилей, при обнаружении явной или неявной конструкции apply-template процессор находит соответствующий узел в дереве исходного документа. Обнаружив соответствие, процессор использует содержание шаблона в качестве основы для результата, записываемого в дерево на выходе. Например, если задачей является визуализация документа в браузере, шаблон может содержать конструкции HTML. Для печатных материалов на выходе будут объекты форматирования XSL, которые можно трансформировать в графические объекты с помощью устройств форматирования для печати.
© 2003-2007 INTUIT.ru. Все права защищены. |
Как связать элементы документа XML с правилами CSS
Поняв, что язык CSS описывает мир в виде ячеек, рассмотрим, каким образом можно связать с этими ячейками элементы XML. Ответ: с помощью правил. Правила состоят из группы свойств, связанных с одним или несколькими типами элементов. Каждое правило содержит раздел сравнения и процедурный раздел (или раздел действия). В языке CSS раздел сравнения называется также селектором, а процедурная часть - коллекцией свойств. Следовательно, язык CSS основан на правилах. Взгляните на пример правила CSS:
Раздел сравнения или селектор Процедура или свойства
Имя { font-family: Arial, Helvetica; color: blue; display: block; padding-bottom: 0.5 px; padding-top: 0.5 px; }
Слева находится раздел сравнения с образцом (т.е. селектор), определяющий имя элемента. Справа содержится описание того, как эту ячейку следует отобразить (свойства).
При визуализации CSS чрезвычайно зависит от структуры документа. Часто дерево объектов форматирования идентично дереву документа. В принципе таблицы стилей CSS ассоциируют имеющие специфические свойства объектов форматирования CSS с каждым элементом XML.
Модели представления
Рассмотрим две модели представления документа: визуальную и звуковую. Последняя предполагает последовательное представление объектов, поэтому звуковой браузер должен быть устройством, зависящем от времени. С другой стороны, модель зрительного представления предполагает пространственное расположение объектов, так что визуальный браузер должен зависеть от пространственных характеристик. Рассмотрим основные устройств.
Объекты форматирования XSL
При работе с печатными материалами документы XML можно трансформировать в объекты форматирования XSL. Затем в наиболее актуальных реализациях эти объекты преобразуются в другой формат, например PDF, в ходе отдельного процесса. Для выполнения описанных действий используется часть спецификации XSL - XSLF. Следует упомянуть, что объекты форматирования XSL трансформируются не только в формат PDF: для отображения результатов трансформации конкретные реализации могут предлагать и другие форматы, такие как ТеХ, RTF, MIF и т.д. Объекты форматирования XSLF не зависят от какой-либо реализации форматирования или визуализации. Таким образом, обработчик XSLF потенциально может трансформировать документ XML в другой формат на выходе с помощью одной таблицы стилей.
Язык XSL, как видно из его названия, является расширяемым. Это означает, что к имеющимся в языке объектам форматирования легко добавить новые объекты, что позволит избавиться от ограничения таблиц стилей CSS- фиксированного набора объектов форматирования.
Селектор сравнения образцов
Любое правило CSS начинается с селектора. Селектор представляет собой выражение, определяющее сравнение с образцом, который связывает конкретный элемент XML с конкретным правилом. Когда обработчик CSS находит элемент соответствующий селектору, правило запускается. Запуск правила означает просто создание объекта визуализации, который приобретает свойства, заданные телом правила. В таблице ниже показан набор типов селектора, поддерживаемых стандартом CSS2:
* | Соответствует любому элементу |
Е | Соответствует любому элементу Е (любому элементу типа Е) |
Е, F | Соответствует любому элементу Е или элементу F |
Е F | Соответствует любому элементу F, являющемуся потомком элемента Е |
Е > F | Соответствует любому элементу F, являющемуся непосредственным потомком элемента Е |
Е: first-child | Соответствует элементу Е, если Е является первым непосредственным потомком своего родителя |
E: link | Соответствует элементу Е, если Е представляет собой исходный якорь гиперссылки, которая еще не посещалась (: link) или уже посещалась (:visited) |
Е: visited | |
E: active | Соответствует элементу Е при определенных действиях пользователя |
E: hover | |
E: focus | |
Е:lang( с) | Соответствует элементу типа Е, если Е написан на языке с (человеческом). Каким образом определяется язык, показывает язык документа |
Е + F | Соответствует любому элементу F, которому непосредственно предшествует элемент Е |
E [foo] | Соответствует любому элементу Е с заданным атрибутом foo (независимо от его значения) |
E [foo = "warning"] | Соответствует любому элементу Е, атрибут foo которого точно равен выражению "warning" |
Е [foo ~= "warning"] | Соответствует любому элементу Е, атрибут foo которого представляет собой список значений, разделенных пробелами, одно из которых точно равно выражению "warning" |
E [lang | = "еn"] | Соответствует любому элементу Е, атрибут "lang" которого содержит разделенный дефисами список значений, начинающихся слева с сочетания "еn" |
E#myid | Соответствует любому элементу Е, атрибут ID которого равен myid |
Селектор представляет собой последовательность одного или нескольких простых селекторов.
Селектор типа представляет собой просто имя элемента XML, которое соответствует любому вхождению этого элемента в дерево документа XML. Универсальный селектор представляет собой знак "*", означающий соответствие любому элементу.
Селекторы атрибутов позволяют осуществлять более точный выбор или сравнение образцов, вплоть до атрибутов или даже значений атрибутов.
Значительно более детального соответствия можно добиться с помощью селектора ID. Он позволяет применить правило к конкретному элементу, имеющему конкретный ID.
Обычно правила CSS связываются с элементом на основе его положения в дереве документа. Однако селекторы псевдоклассов позволяют обращаться к узлам других типов в дереве документа. Например, псевдокласс first-child позволяет найти и связать правило с первым элементом, порожденным заданным элементом:
TITLE: first-child {...}
Затем конкретное правило CSS можно связать с объектом дерева документа, не указывая явным образом его имя.
Еще одним типом интересного селектора являются псевдоэлементы. Например, может оказаться необходимым переформатировать первую строку параграфа по-другому или первую букву главы написать более крупным шрифтом. В следующем примере выбирается первая строка из содержания данных элемента <DESCRIPTION>, а затем к ней применяется коллекция свойств из этого правила:
DESCRIPTION: first-line{...}
А в следующем коде со свойствами правила ассоциируется первая буква этого содержания:
DESCRIPTION: first-letter{...}
Простые селекторы можно связать цепочкой в одно селекторное выражение, но каждый простой селектор в нем отделяется символами пустого пространства, знаком > или +.
Структура правил CSS
Структура CSS может показаться подобной языкам С или С++, хотя все сходство состоит в том, что правила ограничиваются символами {} и что строка с каждым свойством заканчивается знаком "точка с запятой".
Таблица стилей состоит из нескольких правил. В каждом из них используется такой синтаксис:
Selector {properties}
Селектор показывает, с каким элементом следует сравнить и затем применить свойства, а свойства заключаются в фигурные скобки и используют следующий синтаксис:
Property = attribute: value;
С помощью языка стилей CSS мы связываем свойства с элементами. Селектор (часть правила CSS), содержащий образец для сравнения, указывает на элемент или элементы, которые надо сравнить с данным правилом, а ассоциированные с этим элементом (с помощью селектора) свойства заключаются в фигурные скобки.
Таблица стилей CSS
Этот язык напоминает команды стиля, основанные на языке HTML, и спецификацию реализовать очень просто.
Атом CSS: ячейка
Все элементы CSS содержатся в ячейках. Ячейка представляет собой прямоугольную область с определенными базовыми характеристиками, такими как margin (запас) или border (граница). Все ячейки вкладываются друг в друга, как матрешки. Некоторые ячейки содержат другие ячейки, а другие - только сами содержатся в первых. Конструкцию такого типа можно трансформировать в дерево ячеек, или прямоугольных областей. Само дерево содержится в ячейке контейнера, предназначенного либо для сплошной среды (такой, как браузеры с возможностью прокрутки экрана), либо для печатного материала (где размеры области являются фиксированными).
Типы среды и модульные таблицы стилей
Главной особенностью документов XML является отделение данных от их представления. Таблица стилей CSS - это средство, позволяющее подготовить документ XML для показа. CSS разрешает осуществлять представление в средах нескольких типов:
screen | Экранное устройство, например браузер |
Устройство печати, например для печатания книг | |
aural | Слуховое устройство, например синтезатор речи |
Braille | Устройство Брайля для тактильной обратной связи |
embossed | Устройство для выдавливания, создаваемое страничным принтером Бройля |
projection | Устройство-проектор |
tty | Устройство tty больше известное под названием телетайпа |
tv | Телевизор |
Таблица стилей CSS может содержать спецификацию стилей для нескольких типов сред, например для браузеров, принтеров и речевых устройств. Каждое целевое устройство определяется конструкцией @media. Например, следующее выражение ассоциирует правила CSS с экранным устройством (обычно браузером):
@media screen { BOOKLIST {display : block;} }
Как видите, все правила, предназначенные для конкретного типа среды, содержатся в конструкции @media. Селекторы могут определять применение одних и тех же правил к нескольким элементам, но их точно так же можно использовать для нескольких типов среды:
@media screen , print { BOOKLIST { display : block;} }
Однако иногда для обеспечения модульности спецификации визуализации необходимо разделить таблицу стилей на несколько файлов, например чтобы сохранить таблицу стилей для печати в одном файле, а звуковую таблицу стилей - в другом.
Конструкция @import позволяет импортировать правила из других таблиц стилей. В документе таблицы стилей она должна предшествовать всем остальным конструкциям CSS. Сослаться на импортируемую таблицу стилей можно с помощью ее адреса URL
Конструкции @media и @import можно комбинировать в одном выражении.
Трансформация XML на сервере
Серверы HTTP можно считать файловыми серверами, но в отличие от традиционных файловых серверов их функциональные возможности можно усилить с помощью нескольких расширений. Как правило, эти расширения принимают форму обработчиков сценариев. Такие наиболее популярные обработчики, как ASP, JSP, РНР или Cold Fusion, основаны на шаблонах.
Для обработки документа XML на сервере HTTP должно быть установлено расширение, обрабатывающее такой формат. Простейшим из возможных расширений является то, которое может преобразовать файл XML в документ HTML и отправить этот документ браузеру для визуализации (например, обработчик XSLT). Наиболее сложными расширениями являются полные репозитории XML. Cначала документ XML анализируется и преобразуется во внутреннюю структуру, а затем обработчик стилей трансформирует эту внутреннюю структуру в документ HTML с помощью шаблонов. Однако для сложных репозиториев XML такой анализ не обязателен, поскольку документ уже проанализирован и содержится во внутреннем формате; в этом случае обработчик стилей непосредственно выполняет свою функцию по отношению к этой внутренней структуре. Как правило, серверы, содержащие полный репозитории XML, имеют более высокую производительность, чем простые файловые системы. Однако производительность последних может возрастать при кэшировании документов XML, уже преобразованных в формат HTML.
Трансформация XML у клиента
Если клиент является браузером XML, задача существенно упрощается. Фактически почти каждый сервер HTTP способен передавать ему документы XML, которые будут там визуализированы.
Этот процесс достаточно прост: сервер HTTP посылает браузеру документ XML, а браузер сканирует документ XML в поисках особой конструкции, называемой processing-instruction (команда обработки). Эта команда позволяет браузеру получить таблицу стилей, ассоциированную с этим документом XML и выполнить визуализацию последнего.
Визуальная модель CSS
В языке CSS имеется два основных объекта форматирования:
БлокВстроенный объект
Если говорить об отображаемых на экране элементах, то следует указать еще три:
Плавающий объектСписокТаблица
Здесь можно провести сравнение с таблицей, имеющей определенны специфические характеристики: у нее могут быть заголовки, ячейки, строки и столбцы. Однако модель таких объектов не согласуется с CSS из-за различий в методах ее декларации. Так, хотя блоковые и встроенные потоковые объекты являются значениями свойства display, плавающий объект сам представляет собой свойство, которое принимает различные значения. Таким образом, синтаксис CSS отличается от визуальной модели.
Блок: значение (свойства dilplay)
Встроенный элемент: значение (свойства dilplay)
Таблица: значение (свойства dilplay)
Список: свойство
Плавающий объект: свойство
XSL
По сравнению с CSS расширяемый язык таблиц стилей реализует совершенно другой способ преобразования документа XML в отображаемые объекты. Он значительно более гибок и может быть использован для трансформации документа XML в языки для других сред.
Моделирование не является просто подготовкой документа для визуального представления в сети Web. Если необходимо использовать содержание XML для различных целей, нужно иметь возможность на основании одних исходных файлов создавать различные форматы их представления.
Язык XSL состоит из трех спецификаций:
XPath - http://www.w3.org/TR/xpathXSLT - http://www.w3. огд/TR/xsltXSLF - http://www.w3.org/TR/xsl
В спецификации XSLT внимание обращено на трансформации документа XML, в спецификации XSLF - на форматирование объектов, а в XPath - на доступ к узлам иерархической структуры XML. Обработчик XSL должен, как минимум, поддерживать часть трансформаций (XSLT) и XPath.
Заключительные соображения по поводу CSS
CSS представляет собой простой язык стилей, который легко запомнить и использовать. Его главное преимущество - простота. Если нужно только визуализировать документ XML, не выполняя никаких трансформаций, язык CSS подойдет для этого лучше всего. Его основными недостатками являются отсутствие более сложных моделей визуализации и зависимость от структуры обрабатываемых документов XML. Значит, осуществляющее обработку приложение должно понимать язык. XML. Для получения большей независимости между структурой документа и форматом визуализации лучше воспользоваться языками XSL и DSSSL.
Декларация xsl:function
Элемент xsl:function позволяет описывать самые настоящие пользовательские функции. Имя функции записывается в обязательном атрибуте nаmе, (аргументы функции задаются элементами xsl:param, а тело функции - это конструктор последовательности, записанный в содержимом элементе xsl:function. Результатом функции будет последовательность, созданная конструктором. Тип функции можно указать необязательным атрибутом аs.
Имя функции - это уточненное имя типа QName, причем оно должно обязательно записываться с префиксом.
Все аргументы функции позиционные, следовательно, все элементы xsl:param должны быть записаны в начале тела функции и порядок их записи имеет значение при вызове функции. У аргументов функции не может быть значений по умолчанию, следовательно, элементы xsl:param должны быть пустыми и у них не должно быть атрибутов select. Например:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:usr="http://myexamples.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl: function nаme= " usr:sum " as="xsl:integer"> <xsl:param name="x" as="xsl:integer" /> <хsl:раrаm name="y" as="xsl:integer" /> <xsl:value-of select="$x + $y" /> </xsl:function>
вызвать функцию можно в любом выражении подходящего типа, записав ее имя и аргументы в скобках. Например:
<х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:include href="адрес URI таблицы стилей" />
Его можно записать не только непосредственно в корневом элементе xsl:stylesheet, но, в отличие от элемента xsl:import, в любом месте таблицы стилей. Второе отличие от элемента xsl:import заключается в том, что порядок записи элементов xsl:include в таблице стилей не имеет значения.
Декларация xsl:param
Элемент xsl:param записывается или непосредственно в элементе xsl:stylesheet, чтобы задать параметр преобразования, или в элементе xsl:template, чтобы задать параметр правила, или в элементе xsl:function как аргумент функции. У него один обязательный атрибут name, определяющий имя параметра. Кроме него, часто присутствует необязательный атрибут select, в котором записывается выражение для получения значения параметра:
<xsl:param name="pl" select="10 + 20" />
Если атрибут select отсутствует, то значение параметра берется из содержимого элемента, которым может быть конструктор последовательности узлов и атомарных значений:
<xsl:param name="p2">10</xsl:param>
Если отсутствует и атрибут select, и содержимое элемента, то параметр получает значение пустой строки.
Дли получении значения параметра надо записывать его имя со знаком доллара: &p1,&p2. Например:
<xsl:when test= "&p1=10 ">
Правила, определяющие область видимости параметров, такие же, как и у имен объектов, определенных декларацией xsl:variable.
Еще один необязательный атрибут as содержит желательный тип, к которому будет приведено значение параметра.
Наконец, последний атрибут required, принимающий значения yes или nо (по умолчанию), указывает обязательность параметра. Если параметр обязателен, required="yes", то элемент xsl:param должен быть пустым и не содержать атрибут select. В таком случае он получит определенное значение при вызове функции или элементом xsl:with-param при вызове шаблона.
Декларация xsl:template
Элемент xsl:template определяет шаблонное правило преобразования. Своим атрибутом match он задает образец для отбора узлов, подлежащих преобразованию, а в теле содержит конструктор последовательности узлов и атомарных значений, которая и будет результатом преобразования отобранных по образцу узлов.
<xsl: template match=" Образец" name="Имя">Конструктор</хsl:template>
Каждый из атрибутов match и name не обязателен, но хотя бы один из них должен присутствовать.
Атрибут match содержит образец для отбора преобразуемых узлов.
Атрибут name определяет имя шаблона. Имя шаблона - это обычное уточненное имя XML типа QName. Шаблон можно вызвать по имени элементом xsl:call-template, а если он не содержит атрибута match, то такой вызов обязателен, поскольку неизвестны узлы, к которым его надо применить, и он не будут применяться автоматически. Очень часто именованный шаблон содержит параметры, заданные элементами xsl:param, и вызывается с различным параметрами совсем как обычная функция.
У элемента xsl: template могут быть дополнительные атрибуты mode, as, riority.
Атрибут mode определяет режим обработки.
Атрибут as указывает желаемый тип результата (полученная последовательность будет приведена к этому типу).
Атрибут priority назначает правилу приоритет, который будет учитываться при отборе правил, применимых к некоторому узлу.
При вызове именованного шаблона элементов xsl:call-template атрибуты match,mode и priority игнарируются.
Если у именованного шаблона нет атрибута match, то у него не должно быть и атрибутов mode и priority, в них просто нет никакого смысла.
Декларация xsl:variable
Элемент xsl:variable определяет имя объекта. Оно записывается обязательным атрибутом name. Имя объекта должно быть уточненным именем XML типа QName. Кроме того, атрибутом select переменной можно задать сам объект, а атрибутом as определить тип объекта. Например:
<xsl:variable name="var1" select="count(//person) " as="xs:integer" />
Имя var1 будет хранить число элементов person. Объект может быть получен из содержимого элемента xsl: variable:
<xsl: variable name="var2">10</xsl:variable>
или создан конструктором последовательности:
<xsl:variable name="var3"> <xsl:value-of select="count (//person) " /> <xsl:variable>
Если объект не получен из атрибута select или содержимого элемента xsl: variable, то по умолчанию имя связывается с пустой строкой.
Для того чтобы получить объект, связанный с именем, определенным элементом xsl: variable, перед именем надо поставить знак доллара: $varl, $var2. При этом следует учитывать область действия имени.
Область действия имени простирается на весь элемент, в котором оно определено, начиная с места определения и включая вложенные элементы, если только в них не определено то же самое имя.
Имена, определенные непосредственно в корневом элементе xsl:stylesheet, называются глобальными именами, остальные - локальными именами.
Хотя слово "variable" и переводится с английского языка как "переменная", имя, созданное элементом xsl: variable - это не имя переменной, его значение нельзя изменить. Это только название некоторого объекта, которое удобно использовать в тех случаях, когда объект надо использовать во многих местах таблицы стилей, а его вычисление сложно или громоздко.
и выше находятся встроенные библиотеки
В браузерах Internet Explorer 5 и выше находятся встроенные библиотеки DOM и поддержка XSL. Для сценариев на стороне клиента доступно множество объектов для работы с XML-документом, самые важные из них, объекты XMLDOMDocument, XMLDOMNode, XMLDOMNodeList, XMLDOMParseError представляющие интерфейс для доступа ко всему документу, отдельным его узлам и поддеревьям, предоставляющие необходимую для отладки информацию о произошедших ошибках анализатора соответственно.
Объект XMLDOMNode | реализует базовый DOM интерфейс Node, предназначен для манипулирования с отдельным узлом дерева документа. Его свойства и методы позволяют получать и изменять полную информацию о текущем узле - его тип (является ли текущий узел элементом, комментарием, текстом и т.д.), название, полное название (вместе с Namespace префиксом), его содержимое, список дочерних элементов и т.д. |
Объект XMLDOMDocument | представляет верхний уровень объектной иерархии и содержит методы для работы с документом: его загрузки, анализа, создания в нем элементов, атрибутов, комментариев и т.д. Многие свойства и методы этого объекта реализованы также в класса Node, т.к. документ может быть рассмотрен как корневой узел с вложенными в него поддеревьями. |
Объект XMLDOMNodeList | представляет собой список узлов - поддеревья и содержит методы, при помощи которых можно организовать процедуру обхода дерева. |
Объект XMLDOMParserError | объект позволяет получить всю необходимую информацию об ошибке, произошедшей в ходе разбора документа. Все свойства этого объекта доступны только для чтения. |
Инструкции управления xsl:if, xsl:for-each, xsl:choose
Элемент xsl:if запускает конструктор последовательности, содержащийся в его теле, только если истинно выражение, записанное в обязательном и единственном атрибуте test:
<xsl:if test="$x > $у"> <xsl:value-of select="$x"o/> больше <xsl:value-of select="$y" /> </xsl:if> '
У элемента xsl:for-each в обязательном и единственном атрибуте select записывается выражение, дающее в результате последовательность. Для каждого члена этой последовательности выполняется конструктор, содержащийся в теле элемента xsl:for-each. В результате получается цикл, выполняющийся столько раз, сколько элементов у последовательности, полученной в результате вычисления выражения атрибута select.
У элемента xsl:choose нет ни одного атрибута, но в его теле записывается один или несколько элементов xsl: when и один необязательный элемент xsl:otherwise:
<xsl:choose> <xsl when test="$day=l">Понедельник</xsl:when> <xsl when test="$day=2">Bторник</xsl:when> <xsl when test="$day=3">Cреда</xsl:when> <xsl when test="$day=4">Четверг</xsl:when> <xsl when test="$day=5">Пятница</xsl:when> <xsl when test="$day=6">Cy66oтa</xsl:when> <xsl when test="$day=7">Bocкpeceнье</xsl:when> <xsl otherwise>Ошибка определения дня нeдeли</xsl:otherwise> </xsl:choose>
У элемента 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:apply-templates />
Он предписывает обработать рекурсивно все узлы-потомки узлов, отобранных родительским элементом 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:
<xsl:for-each-group select="name" group-by="@surname">
Выражение, являющееся значением атрибута group-by, может давать несколько ключей группы, и один узел может попасть сразу в несколько групп. Например:
<xsl:for-each-group select="name" group-by="(@second, @surname)">
Второй способ разбить последовательность на группы дает атрибут 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, надо записать:
<xsl:value-of select="$var2" />
Если в результате вычисления выражения получается последовательность, то процессор XSLT версии 1.0 выберет из нее только первый элемент, преобразованный в строку.
Интерфейс Document
Узел Document содержит следующей дочерние узлы: Element(не более чем один), ProcessingInstruction (команда приложения), Comment (комментарий), vDocumentType (тип документа).
Документ представляет собой единое целое. Методы создания документа не предоставляются, эта задача возлагается на агента пользователя. Объектная модель документа не предоставляет способа сохранения сформированного документа, эта задача отводится агенту пользователя. Большинство документов построенных с помощью скрипта исчезает при закрытии окна браузера клиента вследствие того что скрипты клиентов используемые в браузерах не имеют доступа к жесткому диску сервера.
Значение свойства Name интерфейса Document равно #document, а значение свойства Value интерфейса Document равно null.
Документ может иметь только один узел Element, а именно корневой узел.
Интерфейс Node
Все типы узлов объектной модели документа наследуют основной набор свойств от интерфейса Node.
Интерфейс NodeList
Доступ к узлам NodeList можно получить с помощью метода item, который в качестве аргумента использует index. Длину списка можно определить методом length. Интерфейс NodeList хранитзапись дочерних узлов конкретного узла и их позиции. Он является основой структуры дерева документа в памяти компьютера.
Элемент xsl:with-param
Элемент xsl:with-param ссылается на некоторый параметр, имя которого записано в обязательном атрибуте name. Необязательным атрибутом select можно задать выражение, результат вычисления которого будет новым значением параметра:
<xsl:with-param name="pl" select="100 * 20" />
Новое значение можно задать и в содержимом элемента:
<xsl:with-param name="pl">100</xsl:with-param>
Элемент xsl:with-param используется только в инструкциях xsl:apply-templates, xsl:apply-imports, xsl:call-template.
Контрольные вопросы:
Что такое языки разметки. Стилистическая, структурная и семантическая разметки.История развития языков разметки: SGML, HTML, XML. Что такое XML. Как появился XML. XML в качестве данныхСтруктура XML документа. Правильно оформленные и верные документы.Анализатор XML. Событийно управляемые анализаторы. Древовидные анализаторы.Зачем нужно определение типа документа (DTD). Общие принципы написания определений DTD: Недостатки и особенности определений DTD.Моделирование данных с использованием XML. Информационная модель.Отображение на XML. Схемы.Объектная модель документа (DOM).Пространство имен и схемы.Связи и запросы.Трансформация документа XML. Дизайн документов XML.
<
Описание схемы документа на языке XSD
Связать XML документ с его XSD схемой можно разными способами:
подать файлы со схемой на вход анализатора.задать файлы со схемой как свойство анализатора. указать прямо в документе XML.
Рассмотрим 3 способ более подробно.
Если элементы документа не принадлежат никакому пространству имен и записаны без префикса, то в корневом элементе документа записывается атрибут noNamespaceSchemaLocation, указывающий расположение файла со схемой в форме URI:
< root_element_name xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="file_name.xsd">
В этом случае в схеме не должно быть целевого пространства имен.
Если же элементы документа относятся к некоторому пространству имен, то применяется атрибут schemaLocation, в котором через пробел перечисляются пространство имен и расположение файла со схемой, описывающей это пространство имен.
Элементы, из которых будет состоять документ XML, объявляются в схеме компонентом element:
<xsd:element_name="имя элемента" tуре="тип элемента" minOccurs="Haменьшее число появлений элемента в документе" maxOccurs="наибольшее число появлений" />
Значение по умолчанию необязательных атрибутов minOccurs и maxOccurs равно 1. Это означает, что если эти атрибуты отсутствуют, то элемент должен появиться в документе XML ровно один раз.
Указание типа элемента в атрибуте type удобно, если это встроенный простой тип или тип, определенный заранее. Тогда в атрибуте type можно записать только имя типа.
Если же тип элемента определяется здесь же, то определение типа элемента лучше вынести:
<xsd:element name="имя элемента">
Определение типа элемента
</xsd:element>
Объявление атрибута элемента тоже несложно:
<xsd:attribute name=" имя атрибута" type="тип атрибута" use="обязательность атрибута" default="значение по умолчанию" />
Необязательный атрибут use принимает три значения:
optional - описываемый атрибут необязателен (это значение по умолчанию);required - описываемый атрибут обязателен;prohibited - описываемый атрибут неприменим. Это значение полезно при определении подтипа, чтобы отменить некоторые атрибуты базового типа.
Определение типа атрибута, - а это должен быть простой тип, - можно вынести в содержимое элемента attribute:
<xsd:attribute name="имя атрибута">
Тип атрибута
</xsd:attribute>
Описание структуры документа средствами DTD
Для связывания декларации DTD с экземпляром документа в версии XML 1.0 предлагается специальная декларация DOCTYPE.
Декларация DOCTYPE содержит ключевое слово DOCTYPE, за которым следует имя корневого элемента документа, а затем конструкция с декларациями содержания.
Можно написать внешнее подмножество деклараций в отдельном файле DTD, включить внутреннее подмножество в тело декларации DOCTYPE или сделать то и другое. В последнем случае (смешение внутренних и внешних DTD) во внутренних DTD могут быть заданы новые декларации или переписаны те, что содержатся во внешних (по определению спецификации XML анализаторы сначала читают внутреннее подмножество, и потому содержащиеся там декларации пользуются приоритетом).
Блок внутренней декларации разметки тега DOCTYPE состоит из левой квадратной скобки, списка деклараций и правой квадратной скобки:
<! DOCTYPE root_element_name […здесь находятся декларации внутреннего подмножества ... ]>
Для внешних DTD декларация DOCTYPE состоит из обычного ключевого слова и имени корневого элемента, за которым следует еще одно ключевое слово SYSTEM либо PUBLIC, обозначающее источник внешнего определения DTD, а за ним - локализация этого определения.
Допустимое в документе XML содержание определяется с помощью четырех типов декларации разметки в DTD. В следующей далее таблице показаны связанные с этими декларациями ключевые слова и их значения. Первые два типа связаны с информацией, которую мы рассчитываем найти в документе XML, - элементами и атрибутами. Последние два типа используются для поддержки. Особенно облегчают жизнь разработчика словаря XML сущности. Как правило, они состоят из содержания, которое настолько часто используется в DTD или документе, что оправдывает создание специальной декларации. Применение этой декларации напоминает оператор include в языках C/C++, когда в качестве замены для содержания используется имя. Нотации описывают содержание, разработанное не на языке XML. Используются они для того, чтобы объявить конкретный класс данных и связать его с внешней программой.
Например:
<!ELEMENT element_name (elem_1,(elem_2|elem_3))> - элемент element_name должен содержать элемент elem_1, а затем либо elem_2, либо elem_3. Элементы появляются именно в таком порядке.
Если вложенный элемент можно записать в объявляемом элементе несколько раз, то необходимо это указать использую звездочку, плюс или вопросительным знак.
? - элемент или список может встретиться нуль или один раз;
* - элемент или список может встретиться нуль или несколько раз;
+ - элемент или список может встретиться один или несколько раз.
После объявления элемента объявляются его атрибуты. Все атрибуты одного элемента объявляются сразу, одним списком. Список начинается с символов <!ATTLIST, после них через пробел следует имя элемента, к которому относятся атрибуты. Затем идет имя атрибута, его тип или список значений, которые он может принимать (все значения перечисляются через вертикальную черту, в скобках), признак обязательности присутствия атрибута в элементе или значение по умолчанию (это значение будет использовано, если атрибут не записан явно в XML документе).
Тип атрибута записывается одним из ключевых слов:
CDATA - строка символов.ID - уникальный идентификатор, однозначно определяющий элемент, в котором встретился этот атрибут; значения такого атрибута не должны повторяться в документе. Они играют ту же роль, что и первичные ключи в таблицах баз данных. IDREF - идентификатор, содержащий одно из значений атрибутов типа id, используется в качестве ссылки на другие элементы. IDREFS - идентификатор, содержащий набор значений атрибутов типа id, перечисленных через пробелы; тоже используется в качестве ссылки сразу на несколько элементов. ENTITY - имя непроверяемой анализатором сущности объявленных в этом же описании DTD. ENTITIES - имена непроверяемых сущностей.
NMTOKEN - слово, содержащее только символы, применяемые в именах. Атрибуты этого типа могут содержать имена других элементов или атрибутов, например, для того чтобы ссылаться на них.
NMTOKENS - слова, перечисленные через пробелы. NOTATION - обозначение расшифрованное в описании DTD.
Признак обязательности записывается с использование ключевых слов:
#REQUIRED - атрибут надо обязательно записывать в элементе;#IMPLIED - атрибут необязателен, у него нет значения по умолчанию;#FIXED - у атрибута есть только одно значение, которое записывается тут же, через пробел.Пример: <!ATTLIST city type (город | поселок | деревня) "город"> <!ATTLIST pre xml:lang NMTOKEN "ru_RU"> <!ATTLIST pre xml:space (default | preserve) "preserve">
Определение новых типов простых элементов
Кроме встроенных типов в схемах XML можно определить новые типы простых элементов. Они вводятся как
сужение (restriction) встроенного или ранее определенного простого типа,список (list) простых типовобъединение (union) простых типов.
Сужение простого типа определяется компонентом restriction, в котором атрибут base указывает сужаемый простой тип, а в содержимом задаются ограничения, выделяющие определяемый простой тип.
Теги задающие ограничения, называются фасетками (facets). Вот их список:
<maxExclusive> - наибольшее значение, которое уже не входит в определяемый тип;<maxInclusive> - наибольшей значение определяемого типа;<minExclusive> - наименьшее значение, уже не входящее в определяемый тип;<minInclusive> - наименьшее значение определяемого типа;<totalDigits> - общее количество цифр в определяемом числовом типе - сужении типа decimal;<fractionDigits> - количество цифр в дробной части числа;<length> - длина значений определяемого типа;<maxLength> - наибольшая длина значений определяемого типа;<minLength> - наименьшая длина значений определяемого типа;<enumeration> - одно из перечислимых значений;<pattern> - регулярное выражение;<whitespace> - применяется при сужении типа string и определяет способ преобразования пробельных символов <'>\n<'>, <'>\r<'>, <'>\t. Атрибут value этого тега принимает одно из трех значений: preserve - не убирать пробельные символы;replace - заменить пробельные символы пробелами;collapse - после замены пробельных символов пробелами убрать начальные и конечные пробелы, а из нескольких подряд идущих пробелов оставить только один.
В тегах-фасетках можно записывать следующие атрибуты, называемые базисными фасетками (fundamental facets):
ordered- задает упорядоченность определяемого типа, принимает одно из трех значений: false - тип неупорядочен;partial - тип частично упорядочен;total - тип полностью упорядочен;
bounded - задает ограниченность или неограниченность типа значением true или false;cardinality - задает конечность или бесконечность типа значением finite или countably infinite;numeric - показывает, числовой этот тип или нет, значением true или false.
Список определяется компонентом list, в котором атрибутом itemType указывается тип элементов определяемого списка. Тип элементов списка можно определить и в содержимом элемента list.
При определении списка можно применять фасетки <length>, <minLength>, <maxLength>, <enumeration>, <pattern>.
Простой тип-объединение определяется компонентом union, в котором атрибутом memberTypes можно указать имена объединяемых типов. Например:
<xsd: union memberTypes="xsd: string xsd; integer lisstOfInteger" />
Другой способ - записать в содержимом компонента union определения простых типов, входящих в объединение.
Определение простых типов
Простой тип в схемах XML определяется компонентом схемы simpleType, имеющим вид
<xsd:simpleType name="имя типа" >Определение типа</xsd:simpleType"
Определение сложных типов
Тип элемента называется сложным, если в элемент вложены другие элементы и/или в открывающем теге элемента есть атрибуты.
Сложный тип определяется компонентом complexType, имеющим вид:
<xsd:complexType name="имя типа" >
Определение типа
</xsd:complexType>
Необязательный атрибут name задает имя типа, а в содержимом компонента complexType описываются элементы, входящие в сложный тип, и/или атрибуты открывающего тега.
Определение сложного типа можно разделить на три группы:
определение типа пустого элемента (элемента, не содержащего тела, а содержащего только атрибуты в открывающем теге).
Каждый атрибут объявляется одним компонентом attribute, например:
<xsd:complexType name="imageType"> <xsd:attribute name="href" type="xsd:anyURI" /> </xsd:complexType>
определение типа элемента с простым телом (элемента, содержащего тело простого типа и атрибуты в открывающем теге).
Этот тип отличается от простого типа только наличием атрибутов и определяется компонентом simpleContent. В теле этого компонента должен быть либо компонент restriction, либо компонент extension. Атрибутом base задают тип (простой) тела описываемого элемента.
В компоненте extension указываются атрибуты открывающего тега описываемого элемента.
В компоненте restriction, кроме атрибутов, описывается простой тип содержимого элемента и/или фасетки, ограничивающие тип, заданный атрибутом base.
определение типа элемента, содержащего вложенные элементы.
Если значениями определяемого сложного типа будут элементы, содержащие вложенные элементы, то перед тем, как перечислять их описания, надо выбрать модель группы (model group) вложенных элементов. Дело в том, что вложенные элементы, составляющие определяемый тип, могут появляться или в определенном порядке, или в произвольном порядке, кроме того, можно выбирать только один из перечисленных элементов. Эта возможность и называется моделью группы элементов. Она определяется одним из трех компонентов: sequence, all или choice.
Компонент sequence применяется в том случае, когда перечисляемые элементы должны записываться в документе в определенном порядке.
Если же вместо компонента xsd:sequence записать компонент xsd:all, то элементы можно перечислять в любом порядке.
Компонент choice применяется в том случае, когда надо выбрать один из нескольких элементов.
Определение типа элемента со сложным телом
При определении сложного типа можно воспользоваться уже определенным, базовым, сложным типом, расширив его дополнительными элементами, или, наоборот, удалив из него некоторые элементы. Для этого необходимо применить компонент complexContent. В этом компоненте, так же как и в компоненте simpleContent, записывается либо компонент extension, если надо расширить базовый тип, либо компонент restriction, если нужно его сузить. Базовый тип указывается атрибутом base, так же как и при записи компонента simpleContent, но теперь это должен быть сложный, а не простои тип. При сужении базового типа компонентом restriction надо перечислить те элементы, которые останутся после сужения.
Последовательность преобразований
Теперь, после краткого описания основных элементов языка XSLT, можно понять, каким образом они выполняют преобразование документа XML.
Документ XSLT - таблица стилей -состоит из шаблонных правил преобразования, записанных элементами xsl:template. В каждом правиле атрибутом match перечисляется последовательность исходных узлов, для преобразования которых предназначено данное правило, а в содержимом элемента хml:template задается конструктор последовательности преобразованных узлов. Из каждого узла исходного дерева получается один или несколько узлов преобразованного дерева. Порядок записи правил не имеет значения, поскольку для каждого узла исходного дерева просматривается вся таблица стилей в поисках подходящего правила.
Преобразование документов с помощью DOM
W3C DOM представляет собой не зависящее от языка или платформы определение. W3C DOM модель устанавливает стандартную функциональность для навигации по документу и манипулирования содержанием и структурой документов, написанных на языках XML и HTML.
При использовании DOM для работы с текстовым файлом в формате XML она анализирует файл, разбивает его на индивидуальные элементы, атрибуты, комментарии и т.д. Затем в памяти создается представление файла XML в виде дерева узлов в котором каждый объект в документе рассматривает в виде узла: элементы, атрибуты, комментарии, команды обработки и даже составляющий атрибуты обыкновенный текст. После этого разработчик может обращаться к содержанию документа, используя дерево узлов, и при необходимости вносить в него изменения, например чтобы добавить новый элемент( для этого достаточно просто создать новый узел и прикрепить его в качестве потомка к нужному узлу).
В W3C DOM для различных составляющих DOM объектов определены интерфейсы облегчающие манипулирование с деревом узлов, но для этих интерфейсов не предлагается никакой специфической реализации, и ее можно осуществить на любом языке программирования.
Основные типы интерфейсов которые поддерживает объектная модель:
Преобразование документов средствами XSLT
Язык преобразований XSLT - это одна из реализации XML. Все элементы XML, объявленные в языке XSLT, относятся к пространству имен http://www.w3.org/1999/XSL/Transform. Обычно они записываются с префиксом xsl. Если принят этот префикс, то корневой элемент документе XSLT- таблицы стилей- будет называться xsl:stylesheet у которого есть один обязательный атрибут version, указывающий версию языка.
Таблицу стилей можно записать в файл с расширением xsl. Ссылку на таблицу стилей можно поместить в документ XML как одну из инструкций по обработке, а именно инструкцию xml-stylesheet. Пример такой ссылки приведен ниже.
<?xml version="1.0"" encoding="windows-1251" ?> <?xml-stylesheet type="text/xsl" href="simple.xsl"?> <book> <!-- содержание --> </book>
"Увидев" инструкцию по обработке xml-stylesheet, программа-обработчик XML, если она, кроме того, является процессором XSLT, выполнит преобразование, заданное в таблице стилей.
Так же таблицу стилей можно записывать не в отдельный файл, а непосредственно в преобразуемый документ XML. Для этого в элементе xsl:stylesheet предусмотрен атрибут-идентификатор id, на который можно ссылаться обычным образом из инструкции по обработке xml-stylesheet.
<?xml version="1.0" encoding="windows-1251" ? > <?xml-stylesheet type="text/xsl" href=v#simple"?> <book> <xsl:stylesheet version="1.0" id="simple" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- преобразования --> </xsl:stylesheet> <!-- содержание --> </book>
Рассмотрим некоторые элементы языка XSLT.
Применение правил преобразования
Обычно просмотр исходного документа XML начинается с его корневого узла. Для него подбирается правило преобразования, конструктор которого явно или неявно создает корневой узел преобразованного документа. Затем конструктор создает последовательность узлов, которые будут потомками корневого узла нового документа.
Если для какого-то узла дерева документа в таблице стилей не оказалось соответствующего ему правила, то к нему применяется встроенное в процессор XSLT правило по умолчанию. Правила по умолчанию опираются на вид узла.
Для корневого узла и узла-элемента правило по умолчанию означает просмотр его потомков.
Для узла-атрибута и текстового узла встроенное правило по умолчанию создает текстовый узел, содержащий их значения. Если значение атрибута или текстового узла пусто, то правило не делает ничего, точнее говоря, создает пустую последовательность узлов.
Для узла-комментария, инструкций по обработке и узла пространства имен по умолчанию создается пустая последовательность узлов.
С другой стороны, для какого-то исходного узла в таблице стилей может оказаться несколько подходящих правил преобразования. Одним из них всегда будет правило по умолчанию. Как бы то ни было, к узлу всегда применяется только одно правило. Оно отбирается так:
во-первых, из всех импортированных правил отбирается то, которое записано в таблицу стилей в последнюю очередь;во-вторых, импортированное правило отбрасывается, если есть подходящее правило в самой таблице стилей;в-третьих, отбирается правило с наибольшим значением атрибута priority. Если атрибут priority отсутствует, то правилу назначается приоритет по умолчанию, вычисляемый по виду образца, записанного в атрибуте match.
Пролог
Пролог состоит из нескольких частей:
необязательное объявление XML (XML Declaration) которое заключено между символами <?...?>. Объявление содержит: пометку xml и номер версии (version) спецификации XML;указание на кодировку символов (encoding), в которой написан документ (по умолчанию encoding="UTF-8");параметр standalone который может принимать значения "yes" или "no" (по умолчанию standalone="yes"). Значение "yes" показывает, что в документе содержатся все требуемые декларации элементов, a "no" - что нужны внешние определения DTD.
Все это вместе может выглядеть следующим образом:
<?xml version ="1.0" encoding-"windows-1251" standalone="yes"?>.
Важно отметить, что в объявлении XML только атрибут version является обязательным, все остальные атрибуты могут быть опущены и, следовательно, принимать значения по умолчанию. Так же нужно помнить, что все эти атрибуты следует указывать только в приведенном выше порядке.
комментарии.команды обработки.символы пустых пространств.
Необязательное объявление типа документа, DTD (Document Type Declaration) которое заключено между символами <!DOCTYPE...> и может занимать несколько строк. В этой части объявляются теги, использованные в документе, или приводится ссылка на файл, в котором записаны такие объявления.
После объявление типа документа так же могут следовать комментарии, команды обработки и символы пустых пространств.
Поскольку все эти части необязательны, пролог может быть опущен.
Синтаксис XML
Любой XML-документ состоит из следующий частей:
Необязательный пролог.Тело документа.Необязательный эпилог, следующего за деревом элементов.
Рассмотрим каждую из частей более подробно.
Содержание работы
Примеры выполнения лабораторной работы можно скачать
здесьИзучить конструкции языка XML, способы описания структуры документа средствами DTD, описания схемы документа на языке XSD. Изучить способы обработки документов XML.Написать по созданной в лабораторной работе № 1 статистической и динамической модели XML документ.Описать структуру документа средствами DTD.Описать схему документа на языке XSDПреобразовать документ средствами XSLTПреобразовать документ с помощью DOMОформить отчет, включающий постановку задачи, тексты XML, DTD, XSD, XSLT документов, демонстрацию работы программ.Защитить лабораторную работу.Создание преобразованных узлов
После того как к текущему узлу подобрано правило его преобразования, выполняется конструктор последовательности узлов и атомарных значений, записанный в этом правиле. Определение конструктора носит чрезвычайно общий характер.
Конструктор последовательности - это последовательность узлов таблицы стилей, имеющих общий родительский узел, применение которой дает последовательность узлов и атомарных значений. Общий родительский узел, о котором идет речь в определении, - это чаще всего узел-элемент xsl:template, хотя им могут служить элементы xsl:variable, xsl:param и многие другие элементы XSLT.
В конструкторе последовательности могут встречаться четыре вида узлов:
текстовые узлы, которые будут просто скопированы в конструируемую последовательность.узлы-инструкции XSLT, генерирующие последовательности узлов и атомарных значений;внешние, не XSLT-инструкции с именами из пространства имен, отличного от пространства имен XSLT. Они тоже генерируют последовательности узлов и атомарных значений; элементы из пространства имен, отличного от пространства имен XSLT, не являющиеся внешними инструкциями. Они становятся узлами-элементами конструируемой последовательности.
Узлы-инструкции, входящие в конструктор, выполняются и вместе с остальными узлами конструктора образуют одну последовательность узлов и/или атомарных значений. Все подряд идущие атомарные значения из созданной конструктором последовательности преобразуются в строки и собираются в один текстовый узел, в котором они записываются через пробел. Затем в полученной последовательности узлов все подряд идущие текстовые узлы собираются в один текстовый узел без всяких разделителей.
Итак, после применения каждого правила получается последовательность узлов, а после использования всех правил таблицы стилей ко всем выбранным узлам исходного дерева получается набор таких последовательностей. Осталось собрать из этого набора последовательностей одно или несколько деревьев, которые и будут результатом преобразования. Они создаются или явно элементами xsl:result-document, или неявно начальным правилом преобразования.
Очень часто преобразованное дерево выводится на какое-то устройство в виде документа HTML, XHTML, XML или просто в виде плоского ASCII-текста. В самом простом случае выполняется сериализация, для которой в языке XSLT предусмотрен элемент xsl:output.
Создание XML документа с использованием Microsoft Visual Studio .Net
Microsoft Visual Studio .Net позволяет достаточно легко создавать XML документы и XSD схемы к ним. Для того чтобы создать XML документ необходимо в среде разработки Visual Studio .Net выполнить команду меню File | New | File… в появившемся диалоговом окне New File в наборе Templates выделить значок XML File. В результате на основном рабочем поле появится следующего вида страница:
На данной странице можно набрать XML документ. Причем при написании открывающегося тега закрывающийся тег будет появляться автоматически.
Заполнить XML документ данными можно с помощью раздела Data. Для этого в низу окна нужно найти кнопку "Data". В результате страница приобретет примерно следующий вид:
Введенные таким образом данные будут добавлены в XML документ.
Для того чтобы для созданного XML документа написать XSD схему необходимо на рабочем поле щелкнуть правой кнопкой мыши и в выпадающем списке выбрать Create Schema. В результате появиться:
Тип элементов и атрибутов можно выбрать из выпадающего списка.
Тело документа
Тело документа, состоит из одного или больше элементов. В правильно оформленном XML документе элементы формируют простое иерархическое дерево, в котором обязательно присутствует корневой элемент (root element) в который вложены все остальные элементы документа. Имена элементов должны быть уникальны в пределах документа. Имя корневого элемента считается именем всего документа и указывается во второй части пролога после слова Doctype.
Элемент начинается открывающим тегом, затем идет необязательное содержимое элемента, после чего записывается закрывающий тег (в отличие от HTML наличие закрывающего тега обязательно, исключением являются элементы без содержания, так называемые пустые элементы, которые могут быть записаны в сокращенной форме: <имя_элемента/>). В качестве содержимого элемента могут выступать:
другие элементысимвольные данные ссылки на символы
Для того, что бы вставить в текст документа некоторый символ, который, например не присутствует в раскладке клавиатуры либо может быть неправильно истолкован анализатором, используют ссылки на символы. Ссылка на символ обязательно начинается со знака "амперсанта" и заканчивается точкой с запятой. Ссылки на символы записываются в следующем виде:
&# код_символа_в_Unicode;.
Код символа можно записать и в шестнадцатеричном виде. В этом случае перед ним ставится символ "x":
&#xШестнадцатеричный_код_символа;.
ссылки на сущности
Ссылки на сущности позволяют включать любые строковые константы в содержание элементов или значение атрибутов. Ссылки на сущности, как и ссылки на символы, начинающиеся с амперсанта, после которого идет имя сущности и заканчивающиеся точкой с запятой:
&имя_сущности;.
Ссылки на сущности указывают программе-анализатору подставить вместо них строку символов заранее заданную в определении типа документа.
комментарии
Если надо вставить в текст документа комментарий либо сделать какой-то фрагмент "невидимым" для программы-анализатора, то его оформляют следующим образом:
<!--…текст комментария…-->
разделы CDATA
Секция CDATA используется, для того чтобы задать область документа, которую при разборе анализатор будет рассматривать как простой текст, игнорируя любые инструкции и специальные символы. Программа-анализатор не разбивает секцию CDATA на элементы, а считает ее просто набором символов. В отличие от комментариев, содержание данной секции не игнорируется, а передается без изменений на выход программы анализатора, благодаря чему его можно использовать в приложении.
Секция CDATA начинается со строки <![CDATA[ после которой записывается содержимое секции. Завершается секция двумя закрывающими квадратными скобками и знаком "меньше":
<![CDATA[ содержание секции ]]>
инструкции по обработки.
Инструкции по обработке содержат указания программе анализатору документа XML. Инструкции по обработке заключаются между символами <? и ?>. Сразу за начальным вопросительным знаком записывается имя программного модуля, которому предназначена инструкция. Затем, через пробел, идет сама инструкция, передаваемая программному модулю. Сама инструкция это обычная строка, которая не должна содержать набор символов "?>", означающий конец инструкции. Примером инструкции по обработке может служить строка объявления XML:
<?xml version="1.0" encoding="windows-1251"?>
Эта инструкция предназначена программе, обрабатывающей документ XML. Инструкция передает ей номер версии и кодировку, в которой записан документ.
Открывающие теги либо теги пустых элементов в XML могут содержать атрибуты, представляющие собой пару имя=значение. В одном открывающем теге разрешается использовать только один экземпляр имени атрибута. Атрибуты могут содержать ссылки на объекты, ссылки на символы, текстовые символы. В отличие от языка HTML, в XML значения атрибутов обязательно надо заключать в апострофы ('), либо в кавычки ("). Таким образом, атрибут может быть записан в одном из двух форматов:
имя_атрибута="значение_атрибута" имя_атрибут= 'значение_атрибута'.