Стивен Холзнер - XSLT
- Название:XSLT
- Автор:
- Жанр:
- Издательство:Питер
- Год:2002
- Город:Санкт-Петербург
- ISBN:5-94723-271-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Холзнер - XSLT краткое содержание
Эта книга посвящена XSLT — мощным и удобным системам преобразования документов. В ней не только рассматривается весь синтаксис XSLT, от основ до специальных аспектов, но и подробно излагаются современные способы использования XSLT.
Вы найдете сотни практических примеров, таких как осуществление преобразований XSLT на web-cepвepax, подключение к базам данных и использование браузеров для осуществления преобразований на лету.
Книга рассчитана на всех, кто хочет изучать XSLT и использовать его на практике
XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
.
.
.
Получить значение переменной можно, добавив к ее имени префикс $:
There are
books in my library
Заметьте, что если вы присваиваете переменной литерал — как, например, присваивание значения «turkey» (индейка) переменной sandwich
(бутерброд), — литерал необходимо заключить в кавычки, причем они должны отличаться от кавычек, в которые заключены значения атрибутов:
В XSLT 1.0 нет необходимости в атрибуте select — данные можно заключить внутри самого элемента :
turkey
Формально, однако, при пропуске атрибута select
в элементах или и задании этим элементам содержимого вы создаете фрагмент результирующего дерева, который больше не допускается в XSLT 1.1.
Стоит отметить, что имя переменной может включать префикс, как, например, star:PLANET
, который должен соответствовать активному пространству имен. Сравнения осуществляются не сравнением префиксов, а проверкой фактического URI префикса — поэтому star:PLANET
может быть тем же самым, что и nebula:PLANET
, если пространства имен star
и nebula
соответствуют одному и тому же URI.
Область видимости переменной
Элемент можно использовать как элемент верхнего уровня или внутри тела шаблона для создания переменных. Переменные, созданные в элементах высокого уровня, обладают глобальной областью видимости, созданные в телах шаблона — локальной. Область видимости переменной определяет, в какой части таблицы стилей вы можете ее использовать.
Областью видимости глобальной переменной является вся таблица стилей, подразумевая и импортированные или включенные таблицы стилей. Это означает, что переменная доступна в любом месте таблицы стилей, если только она не будет перекрыта локальной переменной с тем же именем. Можно даже обращаться к глобальной переменной до ее объявления. Однако нельзя создавать циклические ссылки (то есть если вы объявили a
через b
, нельзя объявлять b
через а
).
Область видимости локальной переменной ограничена следующими за ней братьями или потомками последующих братьев. В частности это значит, что если вы объявили переменную внутри таких элементов, как , или , она не будет доступна вне этих элементов.
Как правило, вы не можете изменять значение переменной, но вы можете перекрыть ее локальной переменной. То есть локальные переменные перекрывают глобальные в пределах области видимости локальных переменных. Пусть, например, я объявил переменную с именем movie
(кинокартина):
.
.
.
Это элемент верхнего уровня, поэтому movie
— глобальная переменная. Даже внутри шаблонов movie будет сохранять свое начальное значение, если не будет локальной переменной с таким же именем:
.
.
.
Однако если вы объявите локальную переменную movie, в шаблоне эта версия перекроет глобальную переменную:
.
.
.
В этом случае мы перекрыли глобальную переменную при помощи глобальной. Заметьте, однако, что нельзя снова объявить одну и ту же переменную в одном шаблоне с целью попытаться изменить ее значение:
.
.
.
За пределами шаблона локальная переменная невидима, и movie
содержит глобальное значение:
.
.
.
Глобальные переменные тоже нельзя объявлять повторно:
Несмотря на все эти ограничения, вы можете менять значение переменной на каждом шаге цикла , как мы увидим в следующем разделе.
Работа с переменными
Давайте рассмотрим примеры применения переменных. В следующем примере (листинг 9.1) я присваиваю переменной copyright
сообщение об авторских правах и затем с ее помощью добавляю атрибут copyright
во все элементы planets.xml
.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Вот результирующий документ, дополненный атрибутами copyright
Mercury
.0553
58.65
1516
.983
43.4
Venus
.815
116.75
3716
.943
66.8
.
.
.
Переменные зачастую удобны для хранения значении, зависимых от контекста, и мы сейчас рассмотрим еще один пример, о котором я упоминал в начале главы. В этом случае я преобразую planets.xml
в новый документ, в котором для каждой планеты будет один элемент. Каждый из этих новых элементов будет содержать два элемента , содержащих планеты-братья текущей планеты — например, братьями Земли будут Венера и Меркурий:
Venus
Earth
Mercury
Earth
Mercury
Venus
Для примера я поочередно выбираю каждый элемент и прохожу в цикле по всем планетам, создавая элементы для всех планет, не являющихся контекстным узлом. Однако откуда мне известно внутри элемента , какая из планет является контекстным узлом, выбранным шаблоном? Внутри элемента «.» ссылается на текущий узел, с которым работает , но не на контекстный узел шаблона. Проблему можно решить, если сохранить контекстный узел в переменной, которую я назвал contextnode
:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.
.
.
Теперь для проверки в цикле того, что текущий элемент не является контекстным узлом, я могу обратиться к контекстному узлу шаблона как $contextnode
(листинг 9.2).
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Теперь наша проблема решена.
Если у элемента есть тело, он создает переменную, чье значение является фрагментом результирующего дерева. В следующем примере при помощи фрагмента результирующего дерева я задаю значение по умолчанию для атрибута COLOR
(цвет), если значение для него уже не задано. Значение по умолчанию я устанавливаю в « blue
» (голубой):
blue
Строковое значение фрагмента результирующего дерева (то есть либо значение атрибута COLOR
, либо значение по умолчанию, « blue
») присваивается переменной COLOR
. Теперь в выражениях XPath можно обращаться к значению этой переменной, $COLOR
, а не к значению атрибута ( @COLOR
, гарантированно получая при этом значение цвета, даже если у соответствующего элемента отсутствует атрибут COLOR
.
Вот еще один пример фрагмента результирующего дерева. В этом случае я сохраняю элемент буквального результата в переменной START_HTML
:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
My page
.
.
.
Теперь я могу использовать этот элемент буквального результата где угодно:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Интервал:
Закладка: