Чтение онлайн

на главную - закладки

Жанры

Технология XSLT

Валиков Алексей Н.

Шрифт:

<xsl:apply-templates

select="item[generate-id(.)=generate-id(key('src', @source))]"/>

</sources>

 </xsl:template>

 <xsl:template match="item">

<source name="{@source}">

<xsl:copy-of select="key('src', @source)"/>

</source>

 </xsl:template>

</xsl:stylesheet>

Результат

выполнения этого преобразования уже был приведен в листинге 11.2.

Перечисление узлов

Функции

name
и
local-name
предоставляют возможности для работы с документом, имена элементов и атрибутов в котором заранее неизвестны. Например, если шаблон определен как:

<xsl:template match="*[starts-with(local-name, 'чеб')]">

 ...

</xsl:template>

то обрабатываться им будут все элементы, локальные части имен которых начинаются на

"чеб"
(например,
"чебуреки"
,
"Чебоксары"
,
"чебурашка"
).

Следующее преобразование демонстрирует, как при помощи функции

local-name
и ключей сосчитать количество элементов и атрибутов документа с различными именами.

Листинг 11.4. Входящий документ

<foo bar="1">

 <bar foo="2"/>

 <bar bar="3"/>

 <foo foo="4">

<bar bar="5"/>

<bar foo="6"/>

 </foo>

</foo>

Листинг 11.5. Преобразование

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <!-- Выводим информацию в текстовом виде -->

 <xsl:output method="text"/>

 <!--

| Создаем ключ, отображающий узлы атрибутов и элементов

| в их локальные части имен.

+-->

 <xsl:key name="node" match="*" use="local-name"/>

 <xsl:key name="node" match="@*" use="local-name"/>

 <xsl:template match="*|@*">

<xsl:variable name="name" select="local-name"/>

<!--

|
Если узел является первым узлом группы (первым встретившимся

| узлом документа с данным именем), выводим информацию о

| количестве узлов в группе (количество узлов с таким же именем).

+-->

<xsl:if test="generate-id(.) = generate-id(key('node', $name))">

<xsl:text>Node '</xsl:text>

<xsl:value-of select="local-name"/>

<xsl:text>' found </xsl:text>

<xsl:value-of select="count(key('node', $name))"/>

<xsl:text> times.&#xA;</xsl:text>

</xsl:if>

<!-- Рекурсивно обрабатываем дочерний элемент и атрибуты -->

<xsl:apply-templates select="*|@*"/>

 </xsl:template>

</xsl:stylesheet>

Листинг 11.6. Выходящий документ

Node 'foo' found 5 times.

Node 'bar' found 7 times.

Именованный шаблон как функция

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

Но как уже отмечалось ранее, функции расширения ограничивают переносимость преобразований. Во-первых, функции расширения одного процессора совсем необязательно будут присутствовать в другом процессоре — скорее наоборот. Во-вторых, не приходится надеяться, что пользовательские модули, написанные на одном языке или с использованием одного интерфейса, смогут использоваться любым процессором. Поэтому часто перед разработчиком стоит проблема решить определенную задачу, используя только стандартные функции и элементы XSLT.

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

Использование именованных шаблонов как функций обуславливается следующими тезисами.

□ Именованный шаблон можно вызывать вне зависимости от того, какая часть документа обрабатывается в данный момент.

□ Именованному шаблону можно передавать параметры.

□ Результат выполнения именованного шаблона можно присваивать переменной.

Поделиться:
Популярные книги

Месть бывшему. Замуж за босса

Россиус Анна
3. Власть. Страсть. Любовь
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть бывшему. Замуж за босса

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Темный Лекарь 4

Токсик Саша
4. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 4

Таня Гроттер и Исчезающий Этаж

Емец Дмитрий Александрович
2. Таня Гроттер
Фантастика:
фэнтези
8.82
рейтинг книги
Таня Гроттер и Исчезающий Этаж

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Последняя Арена 11

Греков Сергей
11. Последняя Арена
Фантастика:
фэнтези
боевая фантастика
рпг
5.00
рейтинг книги
Последняя Арена 11

Хорошая девочка

Кистяева Марина
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Хорошая девочка

Диверсант. Дилогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.17
рейтинг книги
Диверсант. Дилогия

Старая дева

Брэйн Даниэль
2. Ваш выход, маэстро!
Фантастика:
фэнтези
5.00
рейтинг книги
Старая дева

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро