- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания XSLT - Стивен Холзнер
Шрифт:
Интервал:
Закладка:
Область видимости локальной переменной ограничена следующими за ней братьями или потомками последующих братьев. В частности это значит, что если вы объявили переменную внутри таких элементов, как <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 будет сохранять свое начальное значение, если не будет локальной переменной с таким же именем:
<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>
<!-- здесь $movie = "Mr Blandings Builds His Dream House'-->
<xsl:template match="entertainment">
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->
.
.
.
Однако если вы объявите локальную переменную movie, в шаблоне эта версия перекроет глобальную переменную:
<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'">
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->
<xsl:template match="entertainment">
<!-- здесь $movie = Mr. Blandings Builds His Dream House"-->
<xsl:variable name="movie" select="'Goldfinger'"/>
<!-- здесь $movie = 'Goldfinger'-->
.
.
.
В этом случае мы перекрыли глобальную переменную при помощи глобальной. Заметьте, однако, что нельзя снова объявить одну и ту же переменную в одном шаблоне с целью попытаться изменить ее значение:
<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>
<!-- здесь $movie = Mr. Blandings Builds His Dream House"-->
<xsl:template match="entertainment">
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House"-->
<xsl:variable name="movie" select="'Goldfinger'"/>
<!-- здесь $movie = 'Goldfinger'-->
<xsl:variable name="movie" select="'Withnail and I'"/><!-- Запрещено -->
.
.
.
За пределами шаблона локальная переменная невидима, и movie содержит глобальное значение:
<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>
<!-- здесь $movie = 'Mr Bindings Builds His Dream House' -->
<xsl:template match="entertainment">
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->
<xsl:variable name="movie" select="'Goldfinger'"/>
<!-- здесь $movie = 'Goldfinger'-->
<xsl:variable name="movie" select="'Withnail and I'"/><!-- Запрещено -->
</xsl:template>
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->
.
.
.
Глобальные переменные тоже нельзя объявлять повторно:
<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->
<xsl:template match="entertainment">
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House"-->
<xsl:variable name="movie" select="'Goldfinger'"/>
<!-- здесь $movie = 'Goldfinger'-->
<xsl:variable name="movie" select="'Withnail and I'"/><!-- Запрещено -->
</xsl:template>
<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->
<xsl:variable name="movie" select="'Goldfinger'"/><!-- Запрещено -->
Несмотря на все эти ограничения, вы можете менять значение переменной на каждом шаге цикла <xsl:for-each>, как мы увидим в следующем разделе.
Работа с переменными
Давайте рассмотрим примеры применения переменных. В следующем примере (листинг 9.1) я присваиваю переменной copyright сообщение об авторских правах и затем с ее помощью добавляю атрибут copyright во все элементы planets.xml.
Листинг 9.1. Применение переменной<?xml version="1.0"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:variable name="copyright" select="'(c)2002 Starpowder Inc.'"/>
<xsl:template match="*">
<xsl:copy>
<xsl:attribute name="copyright">
<xsl:value-of select="$copyright"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Вот результирующий документ, дополненный атрибутами copyright
<?xml version="1.0" encoding="utf-8"?>
<PLANETS copyright="(c)2002 Starpowder Inc.">
<PLANET copyright="(c)2002 Starpowder Inc.">
<NAME copyright="(c)2002 Starpowder Inc.">Mercury</NAME>
<MASS copyright="(c)2002 Starpowder Inc.">.0553</MASS>
<DAY copyright="(с)2002 Starpowder Inc.">58.65</DAY>
<RADIUS copyright="(c)2002 Starpowder Inc.">1516</RADIUS>
<DENSITY copyright="(c)2002 Starpowder Inc.">.983</DENSITY>
<DISTANCE copyright="(с)2002 Starpowder Inc.">43.4</DISTANCE>
</PLANET>
<PLANET copyright="(c)2002 Starpowder Inc.">
<NAME copyright="(c)2002 Starpowder Inc.">Venus</NAME>
<MASS copyright="(c)2002 Starpowder Inc.">.815</MASS>
<DAY copyright="(с)2002 Starpowder Inc.">116.75</DAY>
<RADIUS copyright="(c)2002 Starpowder Inc.">3716</RADIUS>
<DENSITY copyright="(c)2002 Starpowder Inc.">.943</DENSITY>
<DISTANCE copyright="(c)2002 Starpowder Inc.">66.8</DISTANCE>
</PLANET>
.
.
.
Переменные зачастую удобны для хранения значении, зависимых от контекста, и мы сейчас рассмотрим еще один пример, о котором я упоминал в начале главы. В этом случае я преобразую planets.xml в новый документ, в котором для каждой планеты будет один элемент. Каждый из этих новых элементов будет содержать два элемента <SIBLINGPLANET>, содержащих планеты-братья текущей планеты — например, братьями Земли будут Венера и Меркурий:
<?xml version="1.0" encoding="utf-8"?>
<Mercury>
<SIBLINGPLANET>
Venus
</SIBLINGPLANET>
<SIBLINGPLANET>
Earth
</SIBLINGPLANET>
</Mercury>
<Venus>
<SIBLINGPLANET>
Mercury
</SIBLINGPLANET>
<SIBLINGPLANET>
Earth
</SIBLINGPLANET>
</Venus>
<Earth>
<SIBLINGPLANET>
Mercury
</SIBLINGPLANET>
<SIBLINGPLANET>
Venus
</SIBLINGPLANET>
</Earth>
Для примера я поочередно выбираю каждый элемент <PLANET> и прохожу в цикле <xsl:for-each> по всем планетам, создавая элементы <SIBLINGPLANET> для всех планет, не являющихся контекстным узлом. Однако откуда мне известно внутри элемента <xsl:for-each>, какая из планет является контекстным узлом, выбранным шаблоном? Внутри элемента <xsl:for-each> «.» ссылается на текущий узел, с которым работает <xsl:for-each>, но не на контекстный узел шаблона. Проблему можно решить, если сохранить контекстный узел в переменной, которую я назвал contextnode:
<?xml version="1.0"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<xsl:for-each select="PLANET">
<xsl:element name="{NAME}">
<xsl:variable name="contextnode" select="."/>
.
.
.
Теперь для проверки в цикле <xsl:for-each> того, что текущий элемент не является контекстным узлом, я могу обратиться к контекстному узлу шаблона как $contextnode (листинг 9.2).
Листинг 9.2. Хранение в переменной информации, зависимой от контекста<?xml version="1.0"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<xsl:for-each select="PLANET">
<xsl:element name="{NAME}">
<xsl:variable name="contextnode" select="."/>
<xsl:for-each select="//PLANET">
<xsl:if test=". != $contextnode">
<xsl:element name="SIBLINGPLANET">
<xsl:value-of select="NAME"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Теперь наша проблема решена.
Если у элемента <xsl:variable> есть тело, он создает переменную, чье значение является фрагментом результирующего дерева. В следующем примере при помощи фрагмента результирующего дерева я задаю значение по умолчанию для атрибута COLOR (цвет), если значение для него уже не задано. Значение по умолчанию я устанавливаю в «blue» (голубой):