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

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

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >
Инструкция 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

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

Трансформация документа XML с помощью модели DOM

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

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >