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

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

Жанры

Холзнер Стивен

Шрифт:

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

sandwich
получить ее значение можно при помощи
$sandwich
. Как и в параметрах, в переменных можно хранить данные всех четырех типов данных XPath. Переменные также имеет смысл применять для хранения значений, которые позже в шаблоне будут изменены. Например, «.» обычно ссылается
на контекстный узел шаблона, но внутри элемента
<xsl:for-each>
«.» ссылается на текущий обрабатываемый в элементе узел, а не на контекстный узел всего шаблона. Для того чтобы обратиться к контекстному узлу, перед входом в цикл
<xsl:for-each>
сохраните его в переменной
contextnode
и затем в теле цикла используйте это значение как
$contextnode
.

Кроме четырех типов данных XPath мы также будем использовать тип данных, поддерживаемый в XSLT 1.0, но не в XSLT 1.1 — фрагменты результирующего дерева, которые создаются элементами

<xsl:variable>
или
<xsl:with-param>
. Фрагменты результирующего дерева могут быть удобны в определенных случаях, как вы увидите далее в этой главе.

Наконец, в этой главе мы также рассмотрим элемент

<xsl:key>
. Впервые он нам встретился в главе 4, теперь мы изучим его более подробно.

Для введения вполне достаточно; давайте перейдем к работе, и начнем мы с переменных.

Элемент <xsl:variable>: создание переменных

Для создания переменных в XSLT служит элемент

<xsl:variable>
, обладающий следующими атрибутами:

• 

name
(обязательный). Имя переменной, устанавливается в QName;

• 

select
(необязательный). Выражение XPath, задающее значение переменной. Если опустить этот атрибут, значение переменной будет определяться содержимым
<xsl:variable>
.

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

select
.

Для создания переменной присвойте ее имя атрибуту name элемента

<xsl:variable>
, а значение переменной атрибуту
select
, как в следующем примере, в котором я создаю переменную
number_books
и сохраняю в ней значение 255: 

<xsl:variable name="number_books" select="255"/>

.

.

.

Получить значение переменной можно, добавив к ее имени префикс $:

<xsl:variable name="number=books" select="255"/>

<xsl:text>There are </xsl:text>

<xsl:value-of select="$number books"/>

<xsl:text> books in my library </xsl:text>

Заметьте, что если вы присваиваете переменной литерал — как, например, присваивание значения «turkey» (индейка) переменной

sandwich
(бутерброд), — литерал необходимо заключить в кавычки, причем они должны отличаться от кавычек, в которые заключены значения атрибутов:

<xsl:variable name="sandwich" select="'turkey'"/>

В XSLT 1.0

нет необходимости в атрибуте select — данные можно заключить внутри самого элемента
<xsl:variable>
:

<xsl:variable name="sandwich">turkey</xsl:variable>

Формально, однако, при пропуске атрибута

select
в элементах
<xsl:variable>
или
<xsl:with-param>
и задании этим элементам содержимого вы создаете фрагмент результирующего дерева, который больше не допускается в XSLT 1.1.

Стоит отметить, что имя переменной может включать префикс, как, например,

star:PLANET
, который должен соответствовать активному пространству имен. Сравнения осуществляются не сравнением префиксов, а проверкой фактического URI префикса — поэтому
star:PLANET
может быть тем же самым, что и
nebula:PLANET
, если пространства имен
star
и
nebula
соответствуют одному и тому же URI.

Область видимости переменной

Элемент

<xsl:variable>
можно использовать как элемент верхнего уровня или внутри тела шаблона для создания переменных. Переменные, созданные в элементах
<xsl:variable>
высокого уровня, обладают глобальной областью видимости, созданные в телах шаблона — локальной. Область видимости переменной определяет, в какой части таблицы стилей вы можете ее использовать.

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

a
через
b
, нельзя объявлять
b
через
а
).

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

<xsl:choose>
,
<xsl:if>
или
<xsl:for-each>
, она не будет доступна вне этих элементов.

Как правило, вы не можете изменять значение переменной, но вы можете перекрыть ее локальной переменной. То есть локальные переменные перекрывают глобальные в пределах области видимости локальных переменных. Пусть, например, я объявил переменную с именем

movie
(кинокартина):

<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House" -->

.

.

.

Это элемент верхнего уровня, поэтому

movie
— глобальная переменная. Даже внутри шаблонов movie будет сохранять свое начальное значение, если не будет локальной переменной с таким же именем:

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

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

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

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

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

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Душелов. Том 4

Faded Emory
4. Внутренние демоны
Фантастика:
юмористическая фантастика
ранобэ
фэнтези
фантастика: прочее
хентай
эпическая фантастика
5.00
рейтинг книги
Душелов. Том 4

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

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

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

(Не) моя ДНК

Рымарь Диана
6. Сапфировые истории
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
(Не) моя ДНК

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Камень. Книга 4

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

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Инквизитор Тьмы 4

Шмаков Алексей Семенович
4. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 4

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, сколько можно?