Вывести все меню

#
Вывести все меню
Добрый день. Есть структура "Левое меню", у пунктов которой есть подменю. Необходимо, чтобы вне зависимости от того, в каком разделе мы находимся всегда выводилось все меню с подменю. Пример:

Строительные материалы (Основной уровень)
  - наш склад (Подуровень)
  - партнёры  (Подуровень)
Строительные смеси (Основной уровень)
  - плиточный клей (Подуровень)
и т.д.

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">
   <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="style">font-weight: bold</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>
         </li>
      </xsl:template>
   </xsl:stylesheet>


Вызов меню из макета:
      $Structure = & singleton('Structure');
      $Structure->ShowStructure(2,'ЛевоеМеню');


Подскажите пожалуйста, что в нем необходимо поменять, может я использую не тот xsl?
#
Re: Вывести все меню
нет вызова подменю
перед </li> в конце можно добавить
<xsl:if test="count(structure[show=1]) &gt; 0">
   <ul>
      <xsl:apply-templates select="structure[show=1]"/>
   </ul>
</xsl:if>
#
Re: Вывести все меню
h4mpy, большое спасибо!
#
Re: Вывести все меню
Возник небольшой вопрос.


<?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><div class="menu_bar" style="background:url(images/menu_bar_1.png) no-repeat;">

         <!-- Показывать ссылку, или нет -->
         <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="style">font-weight: bold</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[show=1]) &gt; 0">
               <ul>
                  <xsl:apply-templates select="structure[show=1]"/>
               </ul>
            </xsl:if>

         </div></li>

      </xsl:template>
   </xsl:stylesheet> 


Куда необходимо вставить div (выделен жирным), чтобы структура была следующая:

           <div class="menu_bar" style="background:url(images/menu_bar_1.png) no-repeat;">Строительные материалы
               <ul>
                  <li><a href="/">наш склад</a></li>
                  <li><a href="/">партнёры</a></li>
               </ul>
            </div>
           <div class="menu_bar" style="background:url(images/menu_bar_1.png) no-repeat;">Тротуарная плитка
               <ul>
               <li><a href="/">виды плитки</a></li>
                  <li><a href="/">производство</a></li>
                  <li><a href="/">примеры работ</a></li>
               </ul>
            </div>


Сейчас у меня каждый элемент вкладывается в div, а если разместить в самом начале, где закоментирован ul, то выводиться только один раз.
#
Re: Вывести все меню
второй mode добавьте
и изучайте 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">
   <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">
         <xsl:apply-templates select="structure[show=1]" mode="menu"/>
   </xsl:template>
  
   <xsl:template match="structure" mode="menu">
      
      <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>

      <div class="menu_bar" style="background:url(images/menu_bar_1.png) no-repeat;">

         <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}">
                     <xsl:if test="current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">
                        <xsl:attribute name="style">font-weight: bold</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[show=1]) &gt; 0">
               <ul>
                  <xsl:apply-templates select="structure[show=1]" mode="submenu"/>
               </ul>
            </xsl:if>
         </div>

      </xsl:template>

   <xsl:template match="structure" mode="submenu">
      
      <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}">
                     <xsl:if test="current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">
                        <xsl:attribute name="style">font-weight: bold</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[show=1]) &gt; 0">
               <ul>
                  <xsl:apply-templates select="structure[show=1]" mode="submenu"/>
               </ul>
            </xsl:if>
         </li>

      </xsl:template>
   </xsl:stylesheet>
#
Re: Вывести все меню
h4mpy, спасибо.
#
Re: Вывести все меню
Хочу внедрить дополнительное свойство в xml, но почему-то оно не выводится.
Создал в структуре дополнительное свойство menu_img, где в малом изображении хранится фоновая картинка для раздела меню.
Посмотрел в руководстве, как вывести изображение в xml, но не получается.

Эту строку:
<div class="menu_bar" style="background:url(images/menu_bar_1.png) no-repeat;">
Заменил на эту:
<div class="menu_bar" style="background:url({propertys/property[@name='menu_img']/small_image/property_file_path}) no-repeat;">
#
Re: Вывести все меню
Все, разобрался. Единственное, что осталось загадкой: работает только тогда, когда указана и большая и маленькая картинка. Когда загружаю только маленькую или только большую - не работает. В том случае когда указана большая и из нее создается маленькая - все отлично.
Авторизация