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

на главную

Жанры

Технология XSLT

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

Шрифт:

<category title="Материнские платы"/>

 </category>

 <category title="Расходные материалы">

<category title="Картриджи">

<category title="Картриджи для плоттеров"/>

<category title="Картриджи для принтеров"/>

</category>

<category title="Тонеры"/>

<category title="Бумага"/>

 </category>

</catalog>

При

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

□ При помощи ключа и уникального идентификатора, сгенерированного функцией

generate-id
, мы найдем в дереве требуемую категорию и присвоим ее переменной
$category
.

□ Воспользовавшись осью

ansector-or-self
, мы найдем все надкатегории данной, то есть все категории, которые прямо или косвенно содержат найденную. Путь выборки будет иметь вид
$category/ancestor-or-self::category
. Найденное множество мы присвоим переменной
$path
.

□ При обработке каждой из категорий мы будем обрабатывать ее подкатегории только в том случае, если она является надкатегорией выбранной; иначе говоря — только в том случае, когда ее узел принадлежит множеству узлов

$path
. Проверять это мы будем при помощи условия
count(.|$path)=count($path)
.

Искомое преобразование в итоге запишется в виде.

Листинг 9.7. Преобразование обрабатывающее наш каталог

<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet

 version="1.0"

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

 <!-- Выводим документ в формате html и кодировке windows-1251 -->

 <xsl:output method="html" encoding="windows-1251"/>

 <!--

| Переменная, которая содержит уникальный

| идентификатор выбранного узла дерева

+-->

 <xsl:param name="current" select="''"/>

 <!-- Определение ключа категории -->

 <xsl:key name="cat" match="category" use="generate-id(.)"/>

 <!-- Находим текущую категорию -->

 <xsl:variable name="category" select="key('cat',$current)"/>

 <!--

|
Находим надкатегории текущей категории, узлы которых

| мы будем раскрывать в дереве

+-->

 <xsl:variable name="path"

select="$category/ancestor-or-self::category"/>

 <!-- Шаблон обработки каталога -->

 <xsl:template match="catalog">

<xsl:apply-templates select="category"/>

 </xsl:template>

 <!-- Шаблон обработки категории-->

 <xsl:template match="category">

<!-- Параметр, указывающий отступ -->

<xsl:param name="indent"/>

<!-- Выводим отступ -->

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

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

<а href="#">

<!-- Перед названием категории выводим соответствующую иконку -->

<img height="11" width="11" border="0">

<xsl:choose>

<!--

| Если категория не содержит субэлементов,

| выводим иконку с точкой

+-->

<xsl:when test="not(*)">

<xsl:attribute name="src">images/dot.gif</xsl:attribute>

</xsl:when>

<!--

| Если категория принадлежит ветке выбранной категории,

| выводим иконку с минусом, что означает раскрытую ветку

+-->

<xsl:when test="count(.|$path)=count($path)">

<xsl:attribute name="src">images/minus.gif</xsl:attribute>

</xsl:when>

<!--

| Если категория не принадлежит ветке выбранной категории,

| выводим иконку с плюсом, что означает нераскрытую ветку

+-->

<xsl:otherwise>

<xsl:attribute name="src">images/plus.gif</xsl:attribute>

</xsl:otherwise>

</xsl:choose>

</img>

<!--

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

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Сколько стоит любовь

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.22
рейтинг книги
Сколько стоит любовь

Мужчина моей судьбы

Ардова Алиса
2. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.03
рейтинг книги
Мужчина моей судьбы

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Охота на царя

Свечин Николай
2. Сыщик Его Величества
Детективы:
исторические детективы
8.68
рейтинг книги
Охота на царя

(не) Желанная тень его Высочества

Ловиз Мия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(не) Желанная тень его Высочества

Гарем на шагоходе. Том 1

Гремлинов Гриша
1. Волк и его волчицы
Фантастика:
боевая фантастика
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Гарем на шагоходе. Том 1

Черный дембель. Часть 5

Федин Андрей Анатольевич
5. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 5

Измена. Возвращение любви!

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