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

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

Жанры

Технология XSLT

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

Шрифт:

URI пространства имен языка XHTML —

"http://www.w3.org/1999/xhtml"
; этому языку мы назначим префикс "
xhtml
" и, кроме того, сделаем это пространство пространством имен по умолчанию:

<xsl:stylesheet

 version="1.0"

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

 xmlns:xhtml="http://www.w3.org/1999/xhtml"

 xmlns="http://www.w3.org/1999/xhtml">

 ...

</xsl:stylesheet>

Начнем

с шаблона, который будет выводить каждую из ссылок. В каждой ссылке мы будем выводить только ее атрибут
href
и текст, который она содержит. Для удобочитаемости мы также добавим элемент
br
и символ переноса строки
&#xA;
.

<xsl:template match="xhtml:a">

 <xsl:copy>

<xsl:copy-of select="@href|text"/>

 </xsl:copy>

 <br/>

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

</xsl:template>

Мы чуть позже познакомимся с элементами

xsl:copy
,
xsl:copy-of
и
xsl:text
, пока же скажем, что

<xsl:copy>

 <xsl:copy-of select="@href|text"/>

</xsl:copy>

копирует в выходящий документ текущий узел, его атрибут

href
(
@href
) и дочерние текстовые узлы (
text
).

Элемент

<xsl:text>&#xA;</xsl:text>
выводит символ переноса строки. Элемент
<br/>
является литеральным элементом результата — он никак не обрабатывается, а просто выводится в результирующий документ.

Следующее преобразование называется идентичным преобразованием — оно просто копирует все узлы один в один:

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

 <xsl:copy>

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

 </xsl:copy>

</xsl:template>

И, наконец, нам понадобится преобразование для элемента

body
— в него мы включим копию содержимого, а также ссылки, отсортированные в алфавитном порядке:

<xsl:template match="xhtml:body">

 <xsl:copy>

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

<h1>Links found on this page:<h1>

<xsl:apply-templates

select=".//xhtml:a[@href and not(xhtml:*)]">

<xsl:sort select="."/>

 </xsl:apply-templates>

 </xsl:copy>

</xsl:template>

Если мы попытаемся выполнить преобразование, состоящее из этих шаблонов, мы обнаружим, что в тексте самого документа ссылки испортились — там тоже

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

Для исправления этой ошибки мы выделим шаблон обработки ссылок в отдельный режим

links
:

<xsl:template match="xhtml:a" mode="links">

 ...

</xsl:template>

Теперь это правило не будет применяться к ссылкам во время копирования содержимого документа, потому что при выполнении инструкции

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

режим будет пустым, значит шаблон для

xhtml:а
вызываться не будет. Для того чтобы применить его при помощи
xsl:apply-templates
, мы добавим в этот элемент атрибут
mode
:

<xsl:apply-templates

 select=".//xhtml:a[@href and not(xhtml:*)]"

 mode="links">

 <xsl:sort select="."/>

</xsl:apply-templates>

Разберем более подробно это определение. Данная инструкция будет применять шаблоны с режимом

links
к узлам, возвращаемым выражением
".//xhtml:a[@href and not (xhtml:*)]"
, отсортированным в алфавитном порядке своих строковых значений. Выражение
".//xhtml:a[@href and not(xhtml:*)]"
возвращает всех потомков текущего узла (путь выборки "
.//
"), которые принадлежат пространству имен
xhtml
, являются элементами с именами
а
, (тест имени "
xhtml:a
"), при этом имеют атрибут
href
и не включают в себя другие элементы (предикат "
[@href and not (xhtml:*)]
").

Преобразование целиком будет иметь следующий вид.

Листинг 5.4. Преобразование, добавляющее перечень ссылок

<xsl:stylesheet

 version="1.0"

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

 xmlns:xhtml="http://www.w3.org/1999/xhtml"

 xmlns="http://www.w3.org/1999/xhtml">

 <xsl:template match="xhtml:body">

<xsl:copy>

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

<h1>Links found on this page:</h1>

<xsl:apply-templates select=".//xhtml:a[@href and not (xhtml:*)]">

<xsl:sort select="."/>

</xsl:apply-templates>

</xsl:copy>

 </xsl:template>

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

<xsl:copy>

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

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Сфирот

Прокофьев Роман Юрьевич
8. Стеллар
Фантастика:
боевая фантастика
рпг
6.92
рейтинг книги
Сфирот

Неверный

Тоцка Тала
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Неверный

Идеальный мир для Лекаря 24

Сапфир Олег
24. Лекарь
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Идеальный мир для Лекаря 24

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

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

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Барон Дубов 8

Карелин Сергей Витальевич
8. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 8

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ермак. Регент

Воплощение Похоти

Некрасов Игорь
1. Воплощение Похоти
Фантастика:
юмористическое фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Воплощение Похоти

Место для битвы

Мазин Александр Владимирович
2. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Место для битвы

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

Винокуров Юрий
33. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIII

Страж Кодекса. Книга VIII

Романов Илья Николаевич
8. КО: Страж Кодекса
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Страж Кодекса. Книга VIII

Отморозок 1

Поповский Андрей Владимирович
1. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 1

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам