Опубликован: 08.08.2007 | Доступ: свободный | Студентов: 1674 / 180 | Оценка: 3.86 / 3.76 | Длительность: 11:46:00
Специальности: Программист
Лекция 12:

Лабораторная работа № 2

Последовательность преобразований

Теперь, после краткого описания основных элементов языка XSLT, можно понять, каким образом они выполняют преобразование документа XML.

Документ XSLT - таблица стилей -состоит из шаблонных правил преобразования, записанных элементами xsl:template. В каждом правиле атрибутом match перечисляется последовательность исходных узлов, для преобразования которых предназначено данное правило, а в содержимом элемента хml:template задается конструктор последовательности преобразованных узлов. Из каждого узла исходного дерева получается один или несколько узлов преобразованного дерева. Порядок записи правил не имеет значения, поскольку для каждого узла исходного дерева просматривается вся таблица стилей в поисках подходящего правила.

Применение правил преобразования

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

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

Для корневого узла и узла-элемента правило по умолчанию означает просмотр его потомков.

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

Для узла-комментария, инструкций по обработке и узла пространства имен по умолчанию создается пустая последовательность узлов.

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

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

Создание преобразованных узлов

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

Конструктор последовательности - это последовательность узлов таблицы стилей, имеющих общий родительский узел, применение которой дает последовательность узлов и атомарных значений. Общий родительский узел, о котором идет речь в определении, - это чаще всего узел-элемент xsl:template, хотя им могут служить элементы xsl:variable, xsl:param и многие другие элементы XSLT.

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

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

Узлы-инструкции, входящие в конструктор, выполняются и вместе с остальными узлами конструктора образуют одну последовательность узлов и/или атомарных значений. Все подряд идущие атомарные значения из созданной конструктором последовательности преобразуются в строки и собираются в один текстовый узел, в котором они записываются через пробел. Затем в полученной последовательности узлов все подряд идущие текстовые узлы собираются в один текстовый узел без всяких разделителей.

Итак, после применения каждого правила получается последовательность узлов, а после использования всех правил таблицы стилей ко всем выбранным узлам исходного дерева получается набор таких последовательностей. Осталось собрать из этого набора последовательностей одно или несколько деревьев, которые и будут результатом преобразования. Они создаются или явно элементами xsl:result-document, или неявно начальным правилом преобразования.

Очень часто преобразованное дерево выводится на какое-то устройство в виде документа HTML, XHTML, XML или просто в виде плоского ASCII-текста. В самом простом случае выполняется сериализация, для которой в языке XSLT предусмотрен элемент xsl:output.

Преобразование документов с помощью DOM

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

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

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

Основные типы интерфейсов которые поддерживает объектная модель:

Интерфейс Document

Узел Document содержит следующей дочерние узлы: Element (не более чем один), ProcessingInstruction (команда приложения), Comment (комментарий), vDocumentType (тип документа).

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

Значение свойства Name интерфейса Document равно #document, а значение свойства Value интерфейса Document равно null.

Документ может иметь только один узел Element, а именно корневой узел.

Интерфейс Node

Все типы узлов объектной модели документа наследуют основной набор свойств от интерфейса Node.

Интерфейс NodeList

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