При отображении этого дерева мы будем раскрывать только определенную выбранную ветвь категорий. Скажем, если пользователь выбрал категорию "Расходные материалы", показывать информацию о компьютерах мы ему не будем. Иными словами, мы будем показывать только те категории, которые являются надкатегориями выбранной. Для того чтобы сделать это как можно эффективнее, мы выполним следующие шаги.
□ При помощи ключа и уникального идентификатора, сгенерированного функцией
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 -->