Технология 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>
  <!--
 
    
        Поделиться:
    
    
            Популярные книги
        
 
        
    Возвышение Меркурия. Книга 5
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
 
                    5.00 
 					
            рейтинг книги
На обочине 40 плюс. Кляча не для принца
Проза:
современная проза
 
                    5.00 
 					
            рейтинг книги
Протокол "Наследник"
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
 
                    5.00 
 					
            рейтинг книги
Япона осень
6. Антикризисный Актив
Фантастика:
героическая фантастика
попаданцы
 
                    5.00 
 					
            рейтинг книги
Двойник Короля 5
5. Двойник Короля
Фантастика:
фэнтези
попаданцы
аниме
 
                    5.00 
 					
            рейтинг книги
Шайтан Иван 6
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
 
                    7.00 
 					
            рейтинг книги
Барон Дубов 8
8. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
 
                    5.00 
 					
            рейтинг книги
Камень. Книга шестая
6. Камень
Фантастика:
боевая фантастика
 
                    7.64 
 					
            рейтинг книги
Жена неверного ректора Полицейской академии
Любовные романы:
любовно-фантастические романы
 
                    4.25 
 					
            рейтинг книги
Ларь
10. Бедовый
Фантастика:
городское фэнтези
мистика
 
                    5.75 
 					
            рейтинг книги
Зауряд-врач
1. Зауряд-врач
Фантастика:
альтернативная история
 
                    8.64 
 					
            рейтинг книги
Я все еще не князь. Книга XV
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
 
                    5.00 
 					
            рейтинг книги
Восход. Солнцев. Книга X
10. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
 
                    5.00 
 					
            рейтинг книги
Эммануэль
1. Эммануэль
Любовные романы:
эро литература
 
                    7.38