Самоучитель XSLT - Преобразования и элементы XSLT с примерами

В этом учебном пособии объясняется, что такое XSLT, его преобразования, элементы и использование на примере. Также рассматривается важность XPath для разработки кода преобразования XSLT:

Термин "XSLT" образован путем объединения двух слов, т.е. "XSL" и "T", "XSL" - это краткая форма "Extensible Stylesheet Language", а "T" - краткая форма "Transformation".

Итак, по сути, XSLT - это язык преобразования, который используется для трансформации/преобразования исходных XML-документов в XML-документы или в другие форматы, такие как HTML, PDF, с помощью XSL-FO (объектов форматирования) и т.д.

Введение в XSLT

Преобразование происходит с помощью XSLT-процессора (например, Saxon, Xalan). Этот XSLT-процессор принимает один или несколько XML-документов в качестве источника с одним XSLT-файлом, который содержит XSLT-код, записанный в нем, и результат/выходные документы будут сгенерированы позже, как показано на следующей диаграмме.

Процессор XSLT анализирует исходные XML-документы, используя X-Path для навигации по различным элементам источника, начиная с корневого элемента и до конца документа.

Все, что вам нужно знать о X-Path

Преобразование XSLT

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

#1) XML-код

Ниже приведен исходный XML-код, на котором будет выполняться код XSLT.

Имя файла: Books.xml

 XSLT Programmer's Reference Michael Kay Wrox $40 4th Head First Java Kathy Sierra O'reilly $19 1st SQL The Complete Reference James R. Groff McGraw-Hill $45 3rd 

#2) Код XSLT

Ниже приведен код XSLT, на основе которого будет выполняться вышеуказанный XML-документ.

Имя файла: Books.xsl

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание

#3) Результат / Код вывода

После использования кода XSLT на приведенном выше XML-документе будет получен следующий код.

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание
5350192956 Справочник программиста по XSLT Майкл Кэй Wrox $40 4-й
3741122298 Head First Java Кэти Сьерра О'Райли $19 1-й
9987436700 SQL The Complete Reference Джеймс Р. Грофф McGraw-Hill $45 3-й

#4) Просмотр результата / вывода в веб-браузере

Книги:

Идентификатор книги Название книги Имя автора Издатель Цена Издание
5350192956 Справочник программиста по XSLT Майкл Кэй Wrox $40 4-й
3741122298 Head First Java Кэти Сьерра О'Райли $19 1-й
9987436700 SQL The Complete Reference Джеймс Р. Грофф McGraw-Hill $45 3-й

Элементы XSLT

Чтобы понять приведенный выше код XSLT и его работу, нам сначала нужно понять различные элементы XSLT и их атрибуты.

#1) ИЛИ

Каждый код XSLT должен начинаться с корневого элемента либо или

Атрибуты:

  • @xmlns:xsl: Соединяет документ XSLT со стандартом XSLT.
  • @version: Определяет версию кода XSLT для синтаксического анализатора.

#2)

Это объявление определяет набор правил, применяемых для обработки или преобразования выбранного входного элемента исходного документа в определенные правила целевых элементов выходных документов.

В основном, существует два типа шаблонов в зависимости от их атрибутов:

(i) Именованный шаблон: Когда элемент xsl: template содержит атрибут @name, это называется именованным шаблоном.

Именованные шаблоны вызываются элементом xsl:call-template.

(ii) Шаблон для подбора: Элемент xsl:template содержит атрибут @match, который содержит шаблон соответствия или XPath, применяемый на входных узлах.

Шаблоны соответствия вызываются элементом xsl:apply-template.

Элемент xsl:template должен иметь либо атрибут @match, либо атрибут @name, либо оба атрибута. Элемент xsl:template, не имеющий атрибута match, не должен иметь атрибута mode и атрибута priority.

Давайте перепишем приведенный выше XSLT(

a) Код XSLT на основе шаблона Match Template с . Смотрите ниже желтый & серый выделенный измененный код, он даст тот же результат, что и выше.

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание

Выделенная область показана на скриншоте:

b) Код XSLT на основе именованного шаблона с . См. ниже желтый & серый выделенный измененный код, он даст тот же результат, что и выше.

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание

Выделенная область показана на скриншоте:

#3)

Процессор найдет и применит все шаблоны, у которых XPath определен в атрибуте @select.

Атрибут @mode также используется, если мы хотим предоставить более одного способа вывода с одним и тем же входным содержимым.

#4)

Процессор выполнит вызов шаблонов, имеющих значение внутри атрибута @name (required).

элемент используется для передачи параметров в шаблон.

#5)

Предоставьте строковое/текстовое значение относительно выражения XPath, определенного в атрибуте @select, как определено в приведенном выше коде.

Это даст значение названия книги.

#6) : Повторение

Это позволит обработать инструкции для каждого набора узлов (xpath определен в атрибуте @select (required)) в отсортированной последовательности.

Приведенный выше код означает для каждого узла набор средств магазин/книга:

/store/book[1]

/store/book[2]

/store/book[3]

можно также использовать в качестве дочернего элемента xsl:for-each для определения порядка сортировки.

#7) : Условная обработка

Инструкция xsl:if будет обрабатываться только в том случае, если булево значение атрибута @test будет истинным, иначе инструкция не будет оценена и будет возвращена пустая последовательность.

 2"> Условие True: количество книг больше двух. 

Результат: Условие True: количество книг больше двух.

Здесь count() является предопределенной функцией.

#8) : Обработка альтернативных условий

xsl:choose имеет несколько причин для различных условий, которые проверяются внутри атрибута @test элементов xsl:when, условие проверки, которое становится истинным первым среди всех xsl:when, будет обработано первым, и есть необязательный элемент xls:otherwise, так что если ни один из тестов условий не становится истинным, то этот xsl:otherwise будет рассмотрен.

 Условие верно: количество книг равно единице. Условие верно: количество книг равно двум. Условие верно: количество книг равно трем. Ни одно условие не совпадает. 

Результат: Условие истинно: количество книг равно трем.

#9)

xsl:copy работает с контекстным элементом, т.е. если это узел, то он скопирует контекстный узел во вновь созданный узел, но не скопирует дочерние элементы контекстного узла. По этой причине такой метод называется неглубоким копированием. В отличие от элемента xsl:copy-of, xsl:copy не имеет атрибута@select.

В приведенном ниже коде элементы контекста копируются в вывод & все дочерние элементы называются & копируются xsl:apply-template рекурсивно.

node() Обозначает все узлы и все их атрибуты рекурсивно.

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

#10)

xsl:copy-of по умолчанию будет рекурсивно копировать последовательность узлов со всеми их дочерними элементами и атрибутами, из-за этой природы это также называется глубоким копированием. Атрибут @select необходим для оценки XPath.

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

Обозначает копию текущего узла и текущего атрибута.

#11)

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

Это будет выведено в вывод как узел комментария.

Результат:

#12)

Это создаст текстовый узел в результирующем документе, значение внутри xsl:text будет выведено в виде строки.

Это

текстовая строка.

Выход:

Это

текстовая строка.

#13)

Это создаст элемент в результирующем документе с именем, указанным в его атрибуте @name. Атрибут name является обязательным атрибутом.

Результат: 5350192956

#14)

Это создаст атрибут для его родительского элемента в документе результата. Имя атрибута определяется атрибутом name, а значение атрибута вычисляется по XPath, указанному в атрибуте select, как показано в приведенном ниже коде. Атрибут name является обязательным атрибутом.

Результат:

#15)

Этот элемент сортирует выбранный узел в последовательности по возрастанию или убыванию. Узел или XPath задается атрибутом @select, а направление сортировки определяется атрибутом @order.

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

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание

Выделенная область показана на этом снимке экрана:

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

Книги:

Идентификатор книги Название книги Имя автора Издатель Цена Издание
3741122298 Head First Java Кэти Сьерра О'Райли $19 1-й
9987436700 SQL The Complete Reference Джеймс Р. Грофф McGraw-Hill $45 3-й
5350192956 Справочник программиста по XSLT Майкл Кэй Wrox $40 4-й

#16)

Этот элемент объявляет переменную, которая содержит значение. Переменная может быть глобальной или локальной. Имя переменной определяется атрибутом @name, а значение, которое будет содержать эта переменная, определяется атрибутом @select.

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

Чтобы определить глобальную переменную, нам просто нужно объявить ее рядом с корневым элементом таблицы стилей, как показано в приведенном ниже коде, выделенном желтым цветом, переменная 'SecondBook' является глобальной переменной и содержит название второй книги.

Доступ к локальной переменной является локальным для элемента, в котором она определена, т.е. эта переменная не будет доступна за пределами элемента, в котором она определена, как показано в приведенном ниже коде, выделенном серым цветом, переменная 'first book' является локальной переменной и содержит название первой книги.

Для вызова глобальной или локальной переменной перед именем переменной используется символ доллара ($), как показано ниже, выделенный желтым цветом. $ .

 Название первой книги: Название второй книги: 

Выделенная область показана на скриншоте:

Результат:

Название первой книги: XSLT Programmer's Reference

Название второй книги: Head First Java

#17)

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

Name - это поставщик для этого ключа по атрибуту @name(" get-publisher "), который в дальнейшем используется внутри функции key(). Атрибут @match предназначен для индексации входного узла выражениями XPath(" книга "), как в приведенном ниже выделенном желтым цветом @match, используется для индексации всех книг, имеющихся в магазине.

По отношению к атрибуту @match используется атрибут @use, который объявляет узел для получения значения для этого ключа через выражение XPath("publisher").

Теперь, предположим, если нам нужна информация о книге, которая опубликована только издательством 'Wrox', то мы можем легко получить это значение через элемент xsl:key, создав пару ключ-значение.

key('get-publisher', 'Wrox') Key() принимает два параметра, первый - имя ключа, в данном случае это 'get-publisher', второй - строковое значение, которое нужно найти, в нашем случае это 'Wrox'.

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание

Выделенная область показана на скриншоте:

Результат:

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание
5350192956 Справочник программиста по XSLT Майкл Кэй Wrox $40 4-й

Результат / Просмотр HTML:

Книги:

Идентификатор книги Название книги Имя автора Издатель Цена Издание
5350192956 Справочник программиста по XSLT Майкл Кэй Wrox $40 4-й

#18)

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

Атрибут @terminate используется с двумя значениями либо 'yes', либо 'no', если значение установлено в 'yes', то парсер немедленно завершает работу, как только условие теста будет выполнено, чтобы сообщение было выполнено.

Чтобы понять это, предположим, что если в нашем входном документе элемент price случайно окажется пустым, как в приведенном ниже коде, то обработка должна немедленно остановиться, как только процессор встретит пустой элемент price, чего можно легко добиться, используя xsl:message внутри условия проверки if, как в приведенном ниже XSLT-коде.

Предупреждение отладчика отображается на стандартном экране приложения: Обработка завершена xsl:message на строке 21.

Ввод XML-кода:

 SQL The Complete Reference Джеймс Р. Грофф McGraw-Hill 3rd 

См. скриншот для выделенной области:

Код XSLT:

Книги:-

Заканчивается: элемент цены пуст.
Идентификатор книги Название книги Имя автора Издатель Цена Издание

Выделенная область показана на скриншоте:

Результат: Обратите внимание, что как только синтаксический анализатор встречает пустой тег price, он немедленно прекращает обработку, из-за чего закрывающие теги , и не попадают в конец файла.

Книги:-

Идентификатор книги Название книги Имя автора Издатель Цена Издание
5350192956 Справочник программиста по XSLT Майкл Кэй Wrox $40 4-й
3741122298 Head First Java Кэти Сьерра О'Райли $19 1-й

См. скриншот для выделенной области:

#19) &

элемент определяет параметр шаблона, если он определен внутри. Он может быть определен либо внутри как глобальный параметр, либо внутри как локальный параметр этого шаблона.

Значение the передается/подставляется при вызове шаблона по адресу или .

передается значение параметра, определенного внутри Атрибут типа @name содержит имя параметра, которое должно соответствовать атрибуту @name элемента. Атрибут @Select используется для установки значения параметра.

Для получения значения параметра, как и переменной, используется знак доллара ($).

Исходный XML-код:

 XSLT Programmer's Reference Michael Kay Wrox $40 4th Head First Java Kathy Sierra O'reilly $19 1st SQL The Complete Reference James R. Groff McGraw-Hill $45 3rd 

Код XSLT:

Список книг Название :-

Название книги:

Выделенная область показана на скриншоте:

Вывод результатов:

Список книг Название :-

Название книги: Справочник программиста по XSLT

Название книги: Head First Java

Название книги: SQL The Complete Reference

#20)

используется для импорта другого модуля таблицы стилей внутрь нашей текущей таблицы стилей. Это помогает достичь модульного подхода к разработке XSLT.

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

Если другая таблица стилей также имеет такое же имя шаблона, как определено в шаблоне, который импортируется, то чужие шаблоны переопределяются вашим собственным шаблоном.

Атрибут @href используется в качестве URI таблицы стилей, которую вы хотите импортировать.

#21)

Как и вышеупомянутый xsl:import, также помогает в достижении модульного подхода к разработке XSLT. Все включенные шаблоны имеют тот же приоритет/приоритет, что и вызывающая таблица стилей. Это как если бы вы скопировали все шаблоны из другой таблицы стилей в свою собственную таблицу стилей.

Атрибут @href используется в качестве URI таблицы стилей, которую вы хотите импортировать.

#22)

Этот элемент используется для указания дерева результатов в выходном файле. Он содержит атрибуты типа @method, которые могут иметь значения 'XML', 'HTML', 'XHTML' и 'text', по умолчанию 'XML'.

@encoding задает кодировку символов, которая будет в выходном файле, как показано в примере ниже encoding="UTF-16″, значения по умолчанию для XML или XHTML могут быть UTF-8 или UTF-16. @indent задает отступ выходного кода XML или HTML, для XML значение по умолчанию "нет", а для HTML и XHTML значение по умолчанию "да".

#23)

Этот элемент используется для удаления несущественных пробелов для перечисленных элементов источника внутри атрибута @element, а если мы хотим удалить пробелы из всех элементов, то мы можем использовать '*' внутри атрибута @elements.

#24)

Этот элемент используется для сохранения пробелов для перечисленных элементов источника внутри атрибута @element, и если мы хотим сохранить пробелы для всех элементов, то мы можем использовать '*' внутри атрибута @elements.

Заключение

Таким образом, в этой статье мы узнали о XSLT, часто используемых элементах XSLT, их использовании на примере исходного и целевого/результатного кода, преобразовании или трансформации исходного элемента в целевой элемент.

Мы также обсудили важность XPath для разработки кода преобразования XSLT. Мы рассмотрели объявление шаблона XSL и вызов шаблона & передачу параметров. Мы научились объявлять глобальные и локальные переменные, их использование в коде XSLT и как их вызывать.

Мы узнали о различных ветвящихся или условных элементах XSLT, таких как xsl:if, xsl:for-each, xsl:choose. Мы поняли разницу между поверхностным и глубоким копированием, сортировкой узлов, отладкой кода XSLT с помощью xsl:message, разницу между именованными шаблонами и шаблонами соответствия, а также форматирование вывода с помощью xsl:output.

Об авторе : Химаншу П. - опытный профессионал в области информационных технологий. Он работал в ITC MNCs в различных сферах бизнеса и на различных технологиях. Любимое занятие Химаншу - чтение журналов и ведение блога.

Прокрутить вверх