
Xsd файл:
Описание: с помощью XML Schema описываем структуру XML: названия элементов и атрибутов, отношения между ними и типы данных.
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="./Schema.xsd">
<xsd:complexType name=”client”>
<xsd:sequence>
<xsd:element name=”name” type=”xsd:string”/>
<xsd:element name=”birth” type=”xsd:date”/>
<xsd:element name=”ID_card” type=”xsd:decimal”/>
<xsd:element name=”telephone” type=”xsd:string”/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name=”employee”>
<xsd:sequence>
<xsd:element name=”name” type=”xsd:string”/>
<xsd:element name=”position” type=”xsd:string”/>
<xsd:element name=”telephone” type=”xsd:string”/>
<xsd:element name=”email” type=”xsd:string”/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name=”contract”>
<xsd:sequence>
<xsd:element name=”ID_card” type=”xsd:decimal”/>
<xsd:element name=”contract_date” type=”xsd:date”/>
<xsd:element name=”term” type=”xsd:gMonthDay”/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="list1">
<xsd:sequence>
<xsd:element ref="client" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="list2">
<xsd:sequence>
<xsd:element ref="employee" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="list3">
<xsd:sequence>
<xsd:element ref="contract" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="fitness">
<xsd:all>
<xsd:element ref="list1"/>
<xsd:element ref="list2"/>
<xsd:element ref="list3"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
Лабораторная №3
Тема: «Изучение XML шаблонов»
Цель: Изучить основы формата XSLT
Теоретические основы:
XSLT (eXtensible Stylesheet Language Transformations) — язык преобразования XML-документов. Спецификация XSLT входит в состав XSL и является рекомендацией W3C.
При применении таблицы стилей XSLT, состоящей из набора шаблонов, к XML-документу (исходное дерево) образуется конечное дерево, которое может быть сериализовано в виде XML-документа, XHTML-документа (только для XSLT 2.0), HTML-документа или простого текстового файла. Правила выбора (и, отчасти, преобразования) данных из исходного дерева пишутся на языке запросов XPath.
XSLT имеет множество различных применений, в основном в области web-программирования и генерации отчётов. Одной из задач, решаемых языком XSLT, является отделение данных от их представления, как часть общей парадигмы MVC (англ. Model-view-controller). Другой стандартной задачей является преобразование XML-документов из одной XML-схемы в другую.
Процесс выполнения XSLT-преобразования
В процессе выполнения XSLT-преобразования задействованы:
один или несколько входных XML-документов;
одна или несколько таблиц cтилей XSLT;
XSLT-процессор;
один или несколько выходных документов.
В простейшем случае XSLT-процессор получает на входе два документа — входной XML-документ и таблицу стилей XSLT — и создает на их основе выходной документ.
Применение правил шаблонов
Язык XSLT является декларативным, а не процедурным. Вместо определения последовательности исполняемых операторов, этот язык определяет правила, которые будут применяться во время преобразования. Само преобразование ведется по фиксированному алгоритму.
В первую очередь XSLT процессор разбирает файл преобразования и строит XML дерево входного файла. Затем он ищет шаблон, который лучше всего подходит для корневого узла и вычисляет содержимое найденного шаблона. Инструкции в каждом шаблоне могут либо напрямую говорить XSLT процессору «создай здесь такой-то тег», либо говорить «обработай другие узлы по тому же правилу, что и корневой узел».
Более подробно этот алгоритм, в чём-то нетривиальный, описывается ниже, хотя многие из его экзотических деталей опущены.
Каждый XSLT-процессор должен выполнить следующие шаги для подготовки к трансформации:
1. Прочитать таблицу стилей XSLT с помощью XML-парсера и перевести его содержимое в дерево узлов (дерево таблицы стилей), согласно модели данных XPath. Синтаксические ошибки «времени компиляции» определяются на этой стадии. Таблицы стилей могут быть модульными, поэтому все включения (инструкции xsl:include, xsl:import) также будут обработаны на этой стадии с целью объединить все шаблонные правила и иные элементы из других таблиц стилей в единое дерево таблицы стилей.
2. Прочитать входные данные XML с помощью XML-парсера, перевести его содержимое в дерево узлов (исходное дерево), согласно модели данных XPath. XML-документ может ссылаться на другие XML-источники с помощью вызова функций document(). Эти вызовы обычно обрабатываются во время выполнения, так как их расположение может являться вычисляемым, а вызовы соответствующих функций могут не происходить вовсе.
3. Удалить пустые узлы из таблицы стилей XSLT, кроме тех, которые являются потомками от элементов xsl:text. Это позволяет исключить появление «лишних» пробелов.
4. Удалить пустые текстовые узлы из исходного дерева, если инструкции xsl:strip-space присутствуют в исходном документе. Это позволяет исключить появление «лишних» пробелов. (Пример выше не использует эту возможность)
5. Пополнить XSLT-дерево тремя правилами, которые предоставляют поведение по умолчанию для любых типов узлов, которые могут быть встречены при обработке. Первое правило — для обработки корневого узла; оно даёт инструкцию процессору обработать каждого потомка корневого узла. Второе правило — для любых текстовых узлов или узлов атрибутов; он даёт команду процессору сделать копию этого узла в результирующем дереве. Третье правило — для всех узлов комментария и узлов-инструкций обработки; никакой операции не производится. Шаблоны, явно заданные в XSLT, могут перекрывать часть или все шаблоны-правила, заданные по умолчанию. Если шаблон не содержит явных правил, встроенные правила будут применены для рекурсивного обхода исходного дерева и только текстовые узлы будут скопированы в результирующее дерево (узлы атрибутов не будут достигнуты, так как они не являются «детьми» их родительских узлов). Полученный таким образом результат обычно нежелателен, так как он является просто конкатенацией всех текстовых фрагментов из исходного XML-документа.
Затем процессор проделывает следующие шаги для получения и сериализации результирующего дерева:
Создаёт корневой узел результирующего дерева.
Обрабатывает корневой узел исходного дерева. Процедура обработки узла описана ниже.
Сериализует результирующее дерево, если необходимо, согласно подсказкам, описанным инструкцией xsl:output.
При обработке узла производятся следующие действия:
1. Производится поиск наиболее подходящего шаблона правила. Это достигается проверкой соответствия шаблона (который является выражением XPath) для каждого правила, указывая узлы, для которых правило может быть применено. Каждому шаблону процессором назначается относительный приоритет и старшинство для облегчения разрешения конфликтов. Порядок шаблонных правил в таблице стилей также может помочь разрешению конфликтов между шаблонами, которые соответствуют одинаковым узлам, но это не оказывает влияния на порядок, в котором узлы будут обрабатываться.
2. Template rule contents are instantiated. Элементы в пространстве имён XSLT (обычно имеющие префикс xsl:) трактуются как инструкции и имеют специальную семантику, которая указывает на то, как они должны интерпретироваться. Одни предназначены для добавления узлов в результирующее дерево, другие являются управляющими конструкциями. Не XSLT-элементы и текстовые узлы, обнаруженные в правиле, копируются, «дословно», в результирующее дерево. Комментарии и управляющие инструкции игнорируются.
Инструкция xsl:apply-templates при её обработке приводит к выборке и обработке нового набора узлов. Узлы идентифицируются с помощью выражения XPath. Все узлы обрабатываются в том порядке, в котором они содержатся в исходном документе.
XSLT расширяет библиотеку функций XPath’s и позволяет определять XPath-переменные. Эти переменные имеют разную область видимости в таблице стилей, в зависимости от того, где они были определены и их значения могут задаваться за пределами таблицы стилей. Значения переменных не могут быть изменены во время обработки.
Хотя эта процедура может показаться сложной, однако она делает XSLT по возможностям похожей на другие языки web-шаблонов. Если таблица стилей состоит из единственного правила, предназначенного для обработки корневого узла, в результат просто копируется всё содержимое шаблона, а XSLT-инструкции (элементы 'xsl:…') заменяются вычисляемым содержимым. XSLT предлагает даже специальный формат («literal result element as stylesheet») для таких простых, одношаблонных трансформаций. Однако, возможность определять отдельные шаблоны и правила сильно увеличивает гибкость и эффективность XSLT, особенно при генерации результата, который очень похож на исходный документ.
Элемент <xsl:output>
Элемент <xsl:output> использовали, главным образом, для задания типа результирующего документа. Этот тип может задать, например, будет ли процессор XSLT записывать инструкцию обработки XML, <?xml version="1.0"?>, в начале документа, а также задать тип MIME (такой, как "text/xml" или "text/html") документов, отправляемых процессором XSLT из web-сервера браузеру. Кроме того, если установить выходной тип в HTML, большинство процессоров XSLT смогут распознать, что не всем элементам HTML необходимы закрывающие или открывающие теги и т.п.
В следующем списке перечислены атрибуты <xsl:output>:
cdata-section-elements (необязательный). Задает имена тех элементов, чье содержимое должно выводиться как разделы CDATA. Принимает значения списка QName, разделенного символами-разделителями;
doctype-public (необязательный). Задает открытый идентификатор, который будет использован в объявлении <!DOCTYPE> в выходных данных. Устанавливается в строковое значение;
doctype-system (необязательный). Задает системный идентификатор, который будет использован в объявлении <!DOCTYPE> в выходных данных. Устанавливается в строковое значение;
encoding (необязательный). Задает кодировку символов. Устанавливается в строковое значение;
indent (необязательный). Определяет, будет ли выходной документ выровнен с отражением структуры вложенности. Устанавливается в yes или no;
media-type (необязательный). Задает тип MIME вывода. Устанавливается в строковое значение;
method (необязательный). Задает формат вывода. Принимает значения "xml", "html", "text" или допустимое имя QName;
omit-xml-declaration (необязательный) Определяет, будет ли включено в вывод объявление XML. Устанавливается в "yes" или "no";
standalone (необязательный). Определяет, будет ли включено в вывод отдельное объявление XML, и если да - устанавливает его значение. Устанавливается в yes или no;
version (необязательный). Задает версию вывода. Принимает значение допустимого NMToken.
Чаще всего используется атрибут method, поскольку именно он определяет требуемый тип выходного дерева. Официально методом вывода по умолчанию является HTML, при условии, что выполняются все три следующих условия:
корневой узел результирующего дерева имеет дочерний элемент;
в названии элемента документа результирующего дерева присутствует часть "html" (в любой комбинации верхнего и нижнего регистров) и пустой URI пространства имен;
все текстовые узлы перед первым дочерним элементом корневого узла содержат только символы-разделители.
Если выполняются все три этих условия, то по умолчанию метод вывода устанавливается в HTML. В ином случае методом вывода по умолчанию является XML.
В следующей таблице дается краткая сводка для каждого XSLT-элемента.
Таблица 1. XSLT-элементы
Элемент |
Описание |
xsl:apply-imports |
Вызывает переопределенное правило шаблона. |
xsl:apply-templates |
Предписывает XSLT-процессору найти и применить соответствующий шаблон в зависимости от типа и контекста каждого выбранного узла. |
xsl:attribute |
Создает узел-атрибут и подсоединяет его к элементу вывода. |
xsl:attribute-set |
Определяет именованный набор атрибутов. |
xsl:call-template |
Вызывает шаблон по имени. |
xsl:choose |
Проводит тестирование по нескольким условиям совместно с элементами <xsl:otherwise> и <xsl:when>. |
xsl:comment |
Формирует комментарий в потоке вывода. |
xsl:copy |
Копирует текущий узел из источника в вывод. |
xsl:copy-of |
Вставляет в результирующее дерево поддеревья и фрагменты результирующего дерева. |
xsl:decimal-format |
Определяет формат decimal-format, который контролирует интерпретацию шаблона формата функцией format-number. |
xsl:element |
Создает выводной элемент с указанным именем. |
xsl:fallback |
Вызывает содержимое шаблона, которое может служить обоснованной заменой для поведения нового элемента, когда таковой встретится. |
xsl:for-each |
Повторяет применение шаблона, применяя его по очереди к каждому узлу набора. |
xsl:if |
Позволяет создавать простые условные фрагменты шаблонов. |
xsl:import |
Импортирует другой XSLT-файл. |
xsl:include |
Включает другой XSLT-файл. |
xsl:key |
Объявляет именованный ключ для использования с функцией key() в выражениях языка XPath. |
xsl:message |
Посылает текстовое сообщение либо в буфер сообщений, либо в окно сообщения. |
xsl:namespace-alias |
Заменяет префикс, связанный с данным пространством имен, другим префиксом. |
xsl:number |
Вставляет форматированное число в результирующее дерево. |
xsl:otherwise |
Проводит тестирование по нескольким условиям совместно с элементами <xsl:choose> и <xsl:when>. |
xsl:output |
Задает параметры, используемые при сериализации результирующих деревьев. |
xsl:param |
Определяет именованный параметр для использования с элементами <xsl:stylesheet> или <xsl:template>. Позволяет задать значение по умолчанию. |
xsl:preserve-space |
Сохраняет пробелы в документе. |
xsl:processing-instruction |
Формирует инструкции по обработке в потоке вывода. |
msxsl:script* |
Определяет глобальные переменные и функции для расширений скриптов. |
xsl:sort |
Определяет критерии сортировки списков узлов, выбираемые функциями <xsl:for-each> или <xsl:apply-templates>. |
xsl:strip-space |
Удаляет пробелы из документа. |
xsl:stylesheet |
Задает элемент документа в XSLT-файле. Элемент документа содержит все остальные элементы XSLT. |
xsl:template |
Определяет повторно используемый шаблон для формирования желаемого вывода для узлов определенного типа в определенном контексте. |
xsl:text |
Формирует текст в потоке вывода. |
xsl:transform |
Выполняет
ту же функцию, что и элемент
|
xsl:value-of |
Вставляет значение выбранного узла в виде текста. |
xsl:variable |
Задает значение, привязанное к выражению. |
xsl:when |
Проводит тестирование по нескольким условиям совместно с элементами <xsl:choose> и <xsl:otherwise>. |
xsl:with-param |
Передает параметр шаблону. |
* обозначение собственного расширения корпорации Майкрософт, поддерживающего скрипты.
В рамках лабораторной работы выполнить следующие пункты:
Организовать подписи к таблицам (название таблицы и заголовки столбцов);
Организовать автоматическую нумерацией строк;
Выделением чётные и нечётные строки цветами;
Организация автоматического вывода суммарной информации по каждой таблице (например, используя следующий вид записей: «Всего записей в таблице: 14»).
Задачи:
1. Изучить виды и область применения XML–преобразований
2. Изучить структуру XSLT–документов
3. Изучить требования для создания корректного XSLT–документа
4. Выучить виды элементов и атрибутов
5. Изучить назначение, способы создания и применения тэга template
6. Научиться использовать переменные в шаблонах
7. Изучить область применения XPath
8. Выучить виды функций и выражений в XPath
9. Выучить виды ветвей и формы их записи в XPath
Структура отчёта:
1. Титульный
2. Содержание
3. Описание целей и задач
4. Описание системы
5. XML, XSD, XSLT файлы
6. Вид БД после преобразования
Пример лабораторной работы №3:
XML файл: остается без изменений, только добавляется инструкция, для того, чтобы обработать XML документ с помощью XSL
<?xml-stylesheet type="text/xsl" href="./fit.xsl"?>
XSD файл: остается без изменений