Многоуровневое меню

#
Многоуровневое меню
Проблема в том, что не могу сделать многоуровневое меню. В FAQ предлагаеться решение этой проблемы путем редактирования XSL шаблона, а именно замена

  на
.

У меня в XSL шаблоне имееться строчка


Т.е что менять для меня непонятно.
Подскажите пожалуйста решение проблемы.

На всякий случай весь шаблон:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>





<table  border="0"   height="200" cellspacing="0" cellpadding="0" style="margin-left:2px; margin-right:4px;">
   <tr>
      <td width="100%" class="menu_line"></td>
   </tr>

   <!-- Выбираем все, у которых level = 0 и show = 1 -->


</table>




  <tr>
    <td width="100%" align = "right"><img border="0"  class="menu_point" width="4" height="7" />

   <!-- Показывать ссылку, или нет -->
   

          <!-- Если внешняя ссылка - ставим внешнюю -->
          
            <a href="{external_link}"></a>
          

   <!-- Если внутренняя ссылка -->
   
      <a href="{link}">

      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      

      <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
      
         <b></b>
      

      
         
      
            </a>
          

      

      
        
      

</td>
</tr>
<tr>
   <td width="100%" class="menu_line"></td>
</tr>





structuremenumenu
Модератор
#
Re: Многоуровневое меню
Никитин Евгений Константинович,
Новый код XSL шаблона с выводом расширенной структуры:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="Windows-1251"/>

<xsl:template match="/document">

<table border="0" width="100%" height="200" cellspacing="0" cellpadding="0" style="margin-left:4px; margin-right:4px;">
<tr>
  <td width="100%" class="menu_line"></td>
</tr>

<!-- Выбираем все узлы структуры всех уровней вложенности -->
<xsl:apply-templates select="//structure"/>
</table>
</xsl:template>

<xsl:template match="structure">
<tr>
<td width="100%"><img border="0" src="/images/menu_point.gif" class="menu_point" width="4" height="7" />

<!-- Показывать ссылку, или нет -->
<xsl:if test="show_link=1">
   
   <!-- Определяем адрес ссылки -->
   <xsl:variable name="link"><xsl:choose>
      <!-- Если внешняя ссылка -->
      <xsl:when test="is_external_link=1"><xsl:value-of disable-output-escaping="yes" select="is_external_link"/></xsl:when>
      <!-- Иначе если внутренняя ссылка -->
      <xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
   </xsl:choose></xsl:variable>

   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>

   <!-- Определяем стиль вывода ссылки -->
   <xsl:variable name="link_style"><xsl:choose>
      <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
      <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
      <!-- Иначе обычный вывод с пустым стилем -->
      <xsl:otherwise></xsl:otherwise>
   </xsl:choose></xsl:variable>

   <!-- Расчитываем размер отступа -->
   <xsl:variable name="padding" select="level * 10"/>

   <div style="padding-left: {$padding}px;">
   <a href="{$link}"><span style="{$link_style}"><xsl:value-of disable-output-escaping="yes" select="name"/></span></a>
   </div>
   
</xsl:if>

<!-- Если не показывать ссылку - выводим просто имя ссылки -->
<xsl:if test="show_link=0">
   <xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>

</td>
</tr>
<tr>
<td width="100%" class="menu_line"></td>
</tr>

</xsl:template>
</xsl:stylesheet>
#
Re: Многоуровневое меню
HostCMS,
А можете показать так же много уровневое меню, только не для разделов и подразделов структуры, а для подразделов инфосистем? В полезных решениях нашел только для структуры, а тот что горизонтальный вывод, написано для инфосистемы - не работает.
Желательно что бы можно было сразу указать следующий вывод пунктов меню

Город - инф. система - не отображать
   Район1 - подраздел - отображать
   Район2 - подраздел - отображать
     улица1 - подподраздел - отображать
     улица2 - подподраздел - отображать

хочу реализовать выпадающее меню, наводим на Район2 и выводится список с улицами (улицай и улица2). именно 2 уровня, 2/й и 3/й.

Странно вот здесь в приведенном шаблоне, при отключенной галочке в адмике на показ ссылки карты сайта, она все равно показывается
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
#
Re: Многоуровневое меню
Посмотрите на форуме http://www.hostcms.ru/forums/22/622/, там нашли причину, по которой у Вас XSL-шаблон не работал
#
Re: Многоуровневое меню
natalya, не работает (
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
Модератор
#
Re: Многоуровневое меню
Varkolak,
Наталья будет только в понедельник, ответ отправил по эл. почте на Ваше письмо.
#
Re: Многоуровневое меню
HostCMS, отправил.
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
#
Re: Многоуровневое меню
Вот еще один вариант XSL-шаблона, выводящего только 2-ой и 3-ий уровни групп инфосистемы:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/document">


   <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
   <xsl:variable name="parent_group_id" select="blocks/parent_group_id"/>
   
   <!-- Если в находимся корне - выводим название информационной системы -->
   <xsl:if test="blocks/parent_group_id=0">
      <h1><xsl:value-of disable-output-escaping="yes" select="blocks/name"/></h1>
      <xsl:value-of disable-output-escaping="yes" select="blocks/description"/>
   </xsl:if>
   
   <!-- Если в находимся в группе - выводим название группы -->
   <xsl:if test="blocks/parent_group_id!=0">
      <h1><xsl:value-of disable-output-escaping="yes" select=".//group[@id=$parent_group_id]/name"/></h1>

      <!-- Путь к группе -->
      <p><xsl:apply-templates select=".//group[@id=$parent_group_id]" mode="goup_path"/></p>
   </xsl:if>

   <!-- Отображение подгрупп данной группы -->
   <ul class="ul_2">
<xsl:apply-templates select=".//group[@parent_id=0]" mode="groups">
<xsl:with-param name="stop" select="0"/>
<xsl:with-param name="style_li">li_3</xsl:with-param>
</xsl:apply-templates>
   </ul>


   <!-- ======================================================== -->
   <!-- Отображение записи информационного блока -->
   <!-- ======================================================== -->

   <!-- если есть элементы для отображения -->
   <xsl:if test="count(blocks/items/item[item_status=1]) > 0">

      <table border="0" cellspacing="0" cellpadding="5" class="news_table">
      <tr>
      <td style="background-color: #eeeeee;"><b>Название</b></td>
      <td style="background-color: #eeeeee;"><b>Изображение</b></td>
      <td style="background-color: #eeeeee;"><b>Цена</b></td>
      </tr>
            <xsl:apply-templates select="blocks/items/item[item_status=1]" />
      </table>
   </xsl:if>

   <p>
   <!-- Строка ссылок на другие страницы информационного блока -->
   <xsl:if test="ОтображатьСсылкиНаСледующиеСтраницы=1">
      <xsl:call-template name="for">
        <xsl:with-param name="items_on_page" select="blocks/items/items_on_page" />
        <xsl:with-param name="current_page" select="blocks/items/current_page" />
        <xsl:with-param name="count_items" select="blocks/items/count_items" />
      </xsl:call-template>
   </xsl:if>
   </p>

   <!-- ======================================================== -->
   <!-- Ссылка на архив -->
   <!-- ======================================================== -->
   <xsl:if test="ОтображатьСсылкуНаАрхив=1">
           <p><a href="{blocks/url}">Архив "<xsl:value-of disable-output-escaping="yes" select="blocks/name"/>"</a></p>
   </xsl:if>
   </xsl:template>


<!-- ======================================================== -->
<!-- Шаблон вывода записей -->
<!-- ======================================================== -->
<xsl:template match="blocks/items/item">

   <!-- определение стиля для черезстрочного выведения фона -->
   <xsl:variable name="style"><xsl:choose>
      <xsl:when test="position() mod 2 = 0">background-color: #eeeeee;</xsl:when>
      <xsl:otherwise></xsl:otherwise>
   </xsl:choose></xsl:variable>

   <tr>
   <!-- Первая ячейка - название и описание товара -->
   <td style="{$style}">
      <strong><a href="{item_path}"><xsl:value-of disable-output-escaping="yes" select="item_name"/></a></strong>

      <!-- описание товара -->
      <br />
      <xsl:value-of disable-output-escaping="yes" select="item_description"/><br/>
   </td>

   <!-- Вторая ячейка - изображение товара -->
   <td style="{$style}">
      <xsl:if test="item_small_image!=''">
         <a href="{item_path}"><img style="padding-right:10px; padding-bottom:10px;" src="/{item_small_image}"/></a>
      </xsl:if>
   </td>

   <!-- Третья ячейка - цена товара -->
   <td style="{$style}">
      <!-- Валюта (дополнительное свойство) -->
      <xsl:value-of disable-output-escaping="yes" select="item_propertys/item_property/currency"/>

      <!-- Сама цена (дополнительное свойство) -->
      <xsl:value-of disable-output-escaping="yes" select="item_propertys/item_property/price"/>
   </td>
</tr>
</xsl:template>

<!-- ======================================================== -->
<!-- Шаблон выводит рекурсивно ссылки на группы инф. элемента -->
<!-- ======================================================== -->

<xsl:template match="group" mode="goup_path">


   <xsl:variable name="parent_id" select="@parent_id"/>

   <xsl:apply-templates select="//group[@id=$parent_id]" mode="goup_path"/>

   <xsl:if test="@parent_id=0">
      <a href="{/document/blocks/url}"><xsl:value-of disable-output-escaping="yes" select="/document/blocks/name"/></a>
   </xsl:if>

   <span class="path_arrow">&#8594;</span> <a href="{/document/blocks/url}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
</xsl:template>

<!-- ======================================================== -->
<!-- Шаблон выводит ссылки подгруппы информационного элемента -->
<!-- ======================================================== -->
<xsl:template match="group" mode="groups">
<xsl:param name="stop" select="0"/>
<xsl:param name="style_li">li_2</xsl:param>

   <li class="{$style_li}">
      <xsl:if test="small_image!=''">
         <a href="{/document/blocks/url}{fullpath}" target="_blank"><img src="/upload/{small_image}"/></a>&#xA0;
      </xsl:if>
      <a href="{/document/blocks/url}{fullpath}"><b><xsl:value-of disable-output-escaping="yes" select="name"/></b></a>

<xsl:if test="$stop != '1'">
<xsl:variable name="cur_gr_id" select="@id"/>

<ul class="ul_3">
<xsl:apply-templates select="group[@parent_id=$cur_gr_id]" mode="groups">
<xsl:with-param name="stop" select="1"/>
<xsl:with-param name="style_li">li_3</xsl:with-param>
</xsl:apply-templates>
</ul>
</xsl:if>

</li>


</xsl:template>



<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
   <xsl:param name="i" select="0" />
   <xsl:param name="items_on_page" />
   <xsl:param name="current_page" />
   <xsl:param name="count_items" />
   
   <xsl:variable name="n" select="$count_items div $items_on_page" />
   
   <xsl:if test="$count_items > $items_on_page and $n > $i">

      <!-- Разделитель ссылок -->
      <!--
      <xsl:if test="$i != 0 and $n > $current_page"> - </xsl:if>
      -->

      <!-- Ставим ссылку на страницу-->
      <xsl:if test="$i != $current_page">

         <!-- Заносим в переменную $parent_group_id идентификатор текущей группы -->
         <xsl:variable name="parent_group_id" select="/document/blocks/parent_group_id" />

         <!-- Определяем группу для формирования адреса ссылки -->
         <xsl:variable name="group_link"><xsl:choose>
            <!-- Если группа не корневая (!=0) -->
            <xsl:when test="$parent_group_id != 0"><xsl:value-of select="/document/blocks//group[@id = $parent_group_id]/fullpath" /></xsl:when>
            <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
            <xsl:otherwise></xsl:otherwise>
         </xsl:choose></xsl:variable>

         <!-- Определяем адрес ссылки -->
         <xsl:variable name="number_link"><xsl:choose>
            <!-- Если не нулевой уровень -->
            <xsl:when test="$i != 0">page-<xsl:value-of select="$i + 1" />/</xsl:when>
            <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
            <xsl:otherwise></xsl:otherwise>
         </xsl:choose></xsl:variable>

         <a href="{/document/blocks/url}{$group_link}{$number_link}" class="page_link"><xsl:value-of select="$i + 1" /></a>
      </xsl:if>
      
      <!-- Не ставим ссылку на страницу-->
      <xsl:if test="$i = $current_page">
         <span class="current"><xsl:value-of select="$i+1" /></span>
      </xsl:if>

      <!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
      <xsl:call-template name="for">
         <xsl:with-param name="i" select="$i + 1" />
         <xsl:with-param name="items_on_page" select="$items_on_page" />
         <xsl:with-param name="current_page" select="$current_page" />
         <xsl:with-param name="count_items" select="$count_items" />
      </xsl:call-template>

   </xsl:if>
</xsl:template>

</xsl:stylesheet>
Гость
Re: Многоуровневое меню
Не работает ваше меню. Если что
#
Re: Многоуровневое меню
Вот такой кусок добавил между <li>...</li>, у меня работает

<xsl:if test="count(.//structure)">
   <ul>   
   <xsl:apply-templates select="structure[show=1]"/>
   </ul>
</xsl:if>


Полностью:


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <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"/>
   
   <!-- ЛевоеМеню -->
   
   <xsl:template match="/document">
      <ul>
         <!-- Выбираем узлы структуры первого уровня -->
         <xsl:apply-templates select="structure[show=1]"/>
      </ul>
      
      <!-- Если вывод подменю -->
      <xsl:if test="submenu/node() and count(structure[show=1]) > 0">
         <hr />
      </xsl:if>
      
   </xsl:template>
   
   <xsl:template match="structure">
      
      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
      <li>
         <!-- Показывать ссылку, или нет -->
         <xsl:choose>
            <xsl:when test="show_link = 1">
               <!-- Определяем адрес ссылки -->
               <xsl:variable name="link">
                  <xsl:choose>
                     <!-- Если внешняя ссылка -->
                     <xsl:when test="is_external_link = 1">
                        <xsl:value-of disable-output-escaping="yes" select="external_link"/>
                     </xsl:when>
                     <!-- Иначе если внутренняя ссылка -->
                     <xsl:otherwise>
                        <xsl:value-of disable-output-escaping="yes" select="link"/>
                     </xsl:otherwise>
                  </xsl:choose>
               </xsl:variable>
               <!-- Ссылка на пункт меню -->
               <a href="{$link}" title="{name}">
                  <!--
                  Выделяем текущую страницу добавлением к <a> стиля font-weight: bold,
                     если это текущая страница, либо у нее есть ребенок с атрибутом id, равным текущей uheggt.
                     -->
                     <xsl:if test="current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">
                        <xsl:attribute name="class">current</xsl:attribute>
                     </xsl:if>
                     <xsl:value-of disable-output-escaping="yes" select="name"/>
                  </a>
               </xsl:when>
               <!-- Если не показывать ссылку - выводим просто имя ссылки -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="name"/>
               </xsl:otherwise>
            </xsl:choose>
                     <xsl:if test="count(.//structure)">
                        <ul>
                           <!-- Выбираем узлы структуры первого уровня -->
                           <xsl:apply-templates select="structure[show=1]"/>
                        </ul>
                     </xsl:if>
         </li>
                     

      </xsl:template>
   </xsl:stylesheet> 
Авторизация