Stepan0v, вот такой код для решения на XSL. Он получился несколько более изящным, чем та идея, которую я вчера описывал словами:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:hostcms="http://www.hostcms.ru/" exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="UTF-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!--Выберем первые 10 элементов к показу-->
<xsl:variable name="items" select="/informationsystem/informationsystem_item[position() <= 10]"/>
<!--корневой темплейт-->
<xsl:template match="/informationsystem">
<!--Выводим элементы, которые лежат прямо в корне ИС, если таковые попали в выборку-->
<xsl:apply-templates select="$items[informationsystem_group_id = 0]"/>
<!--Матчим корневые группы, по условию, что id самих групп или их (под-...)подгрупп есть среди informationsystem_group_id у выбранных ранее элементов-->
<xsl:apply-templates select="informationsystem_group[@id = $items/informationsystem_group_id or .//informationsystem_group/@id = $items/informationsystem_group_id]"/>
</xsl:template>
<!--Общий шаблон для групп-->
<xsl:template match="informationsystem_group">
<!--Определеяем уровень вложенности текущей группы. Для групп в корне он будет равен 1-->
<xsl:variable name="level" select="count(ancestor-or-self::informationsystem_group)"/>
<!--Рисуем div с отступом слева. Чисто для красоты.
Для групп верхнего уровня отступ не делаем, поэтому от $level отнимаем едничку-->
<div style="margin-left:{20*($level - 1)}px">
<!--Создаем html-элемент Заголовок нужного нам уровня.
Внимание! Это не будет корректно работать, если глубина вложенности групп больше 6-->
<xsl:element name="{concat('h', $level)}">
<!--Выводим название текущей группы-->
<xsl:value-of select="name"/>
</xsl:element>
<!--Выводим элементы текущей группы, если таковые попали в выборку-->
<xsl:apply-templates select="$items[informationsystem_group_id = current()/@id]"/>
<!--Матчим подгруппы текущей группы, по условию, что id самих подгрупп или их подподгрупп есть среди informationsystem_group_id у выбранных инфоэлементов-->
<xsl:apply-templates select="informationsystem_group[@id = $items/informationsystem_group_id or .//informationsystem_group/@id = $items/informationsystem_group_id]"/>
</div>
</xsl:template>
<!--Темлейт для вывода элементов-->
<xsl:template match="informationsystem_item">
<p>
<!--Выводим название инфоэлемента-->
<xsl:value-of select="name"/>
</p>
</xsl:template>
</xsl:stylesheet>
Этот код, на основе вашего XML порождает следюущий html-документ:
<div style="margin-left:0px">
<h1>Тексты (книги, статьи, рецензии, интервью)</h1>
<div style="margin-left:20px">
<h2>1963</h2>
<p>Раймон Руссель или ужас пустоты</p>
</div>
<div style="margin-left:20px">
<h2>1966</h2>
<p>Бергсонизм</p>
</div>
<div style="margin-left:20px">
<h2>1974</h2>
<p>28 ноября 1947 г. Как сделать себя телом без органов? (совместно с Ф.Гваттари)</p>
</div>
<div style="margin-left:20px">
<h2>1994</h2>
<p>Вещь в себе у Канта (совместно с Ferdinand Alquie, Louis Guillermit and Alain Vinson)</p>
</div>
<div style="margin-left:20px">
<h2>1996</h2>
<p>Актуальное и виртуальное</p>
</div>
<div style="margin-left:20px">
<h2>2000</h2>
<p>Алфавит Жиля Делеза</p>
</div>
</div>
<div style="margin-left:0px">
<h1>Публикации под редакцией Ж.Делёза</h1>
<p>Instincts et institutions</p>
</div>
<div style="margin-left:0px">
<h1>Диссертации, защищенные под руководством Ж.Делёза</h1>
<p>Alliez, Eric. "Naissance et conduites des temps capitaux"</p>
</div>
<div style="margin-left:0px">
<h1>Обращения и петиции, подписанные Ж.Делёзом</h1>
<p>«Призыв к рабочим и служащим восстать против организованной сети расистов, опирающихся на властные структуры» (против анти-Алжирского движения)</p>
</div>
<div style="margin-left:0px">
<h1>Dubia</h1>
<div style="margin-left:20px">
<h2>1977</h2>
<p>Вводные и заключительные комментарии…</p>
</div>
</div>
Однако, несмотря на кажущуюся простоту и элегантность он плох.
Вот эти выражения
informationsystem_group[@id = $items/informationsystem_group_id or .//informationsystem_group/@id = $items/informationsystem_group_id]
- они очень дорогие, профайлер показывает, что 77% времени выполнения всего шаблона уходит на вычисление этих выражений. При чем, затраты времени в процентном отношении увеличиваются, при росте числа элементов в первоначальной выборке.