XSL проверка активного пункта меню

#
XSL проверка активного пункта меню
Взяли XSL для ИС Карта сайта.
там есть такой участок (строки с 40 по 48):

            <!-- Определяем стиль вывода ссылки -->
            <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>


Однако все пункты меню не проходят проверку и стиль выводится пустой...
Что-то тут, видимо, не так?
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: XSL проверка активного пункта меню
Надо посмотреть наличие
/site/current_structure_id
в обрабатываемом xml, и еще, я-бы попробовал (не глядя в xml трудно сказать нваерняка)
строку
<xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
написать так
<xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
#
Re: XSL проверка активного пункта меню
ну тогда привожу полный код 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"/>
   
   <xsl:template match="/site">
      <ul class="menu">
         <!-- Выбираем узлы структуры -->
         <xsl:apply-templates select="child::*[show=1]"/>
      </ul>
   </xsl:template>
   
   <xsl:template match="*">
      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
      
      <!-- Определяем стиль вывода элемента в меню -->
      <xsl:variable name="li_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">expand</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>simple</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <!-- Определяем стиль вывода элемента в меню -->
      <xsl:variable name="ul_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">expand2</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>simple2</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
   
      <li class="{$li_style}">         
         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show = 1">
            <!-- Определяем адрес ссылки -->
            <xsl:variable name="link">
               <xsl:choose>
                  <!-- Если внешняя ссылка -->
                  <xsl:when test="url != ''">
                     <xsl:value-of disable-output-escaping="yes" select="url"/>
                  </xsl:when>
                  <!-- Иначе если внутренняя ссылка -->
                  <xsl:otherwise>
                     <xsl:value-of disable-output-escaping="yes" select="link"/>
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:variable>
            
      <!-- Определяем стиль вывода элемента в меню -->
      <xsl:variable name="a_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">active</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>passive</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
            
            <a href="{$link}" class="{$a_style}">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </xsl:if>
         
         <!-- Выбираем подузлы структуры -->
         <xsl:if test="count(child::*[show=1]) &gt; 0">
            <ul class="acitem {$ul_style}">
               <!-- Выбираем узлы структуры -->
               <xsl:apply-templates select="child::*[show=1]"/>
            </ul>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>


структура меню следующая

<ul class="menu">
   <li class="simple">
      <a class="passive" href="/">Главная</a>
   </li>
   <li class="simple">...</li>
   <li class="simple">...</li>
   <li class="expand">
      <a class="active" href="/wedding-dresses/">Свадебные платья</a>
      <ul class="acitem expand2" style="display: block;">
         <li class="simple">...</li>
         <li class="simple">
            <a class="passive" href="/wedding-dresses/edelweis/">Edelweis</a>
         </li>
         <li class="simple">...</li>
         <li class="simple">...</li>
         <li class="simple">...</li>
         <li class="simple">...</li>
         <li class="simple">...</li>
         <li class="simple">...</li>
      </ul>
   </li>
   <li class="simple">...</li>
   <li class="simple">...</li>
   <li class="simple">...</li>
   <li class="simple">...</li>
   <li class="simple">...</li>
</ul>

В меню выводятся группы информационной системы /wedding-dresses (ИС) /edelweis (Группа)/,
Если мы заходим в группу ИС - то пункт меню всё равно не активный, то есть стиль не назначается...
такое ощущение, что путь к группе ИС проверку на текущий ID в структуре не проходит...

Или где-то неправильно сделано?
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: XSL проверка активного пункта меню
В общем, если меню делать в структуре, то всё работает, стили назначаются ровно.
НО! Если заходишь в группу, то в меню она никак не отмечается, тоесть стиль ко всем элементам меню, которые выдаёт Информационная Система, НЕ ПРОПИСЫВАЮТСЯ!
трабл...
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: XSL проверка активного пункта меню
Думается мне, подождать пару дней и бегом на поклон к саппорту...
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: XSL проверка активного пункта меню
Спасибо саппорту, помогли.
Всё работает!
Знания имеют свои пределы, и только глупость человеческая не знает границ...
Модератор
#
Re: XSL проверка активного пункта меню
ez-web,
можете изменения поддержки опубликовать в теме, явно будут другие пользователи, которые будут спрашивать "что же было".
#
Re: XSL проверка активного пункта меню
Подскажите по сабжу.. в чем загвоздка? Решаю аналогичную проблему...
SNN
#
Re: 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"/>
   
   <xsl:template match="/site">
      <ul class="menu">
         <!-- Выбираем узлы структуры -->
         <xsl:apply-templates select="child::*[show=1]"/>
      </ul>
   </xsl:template>
   
   <xsl:template match="*">
      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
      
      <!-- Определяем стиль вывода списка в субменю -->
      <xsl:variable name="ul_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1 or count(.//structure[@id=$current_structure_id])=@id">opened</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>closed</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <!-- Определяем стиль вывода элемента в меню и субменю -->
      <xsl:variable name="li_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1 or count(.//structure[@id=$current_structure_id])=@id">expand</xsl:when>
            <xsl:when test="$current_structure_id=@id or /site/informationsystem_group_id = @id or count(.//structure[@id=$current_structure_id])=1 or count(.//informationsystem_group[@id=/site/informationsystem_group_id])=1">expand</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>simple</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      

      
      <!-- Определяем стиль вывода ссылки в меню и субменю -->
      <xsl:variable name="a_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or /site/informationsystem_group_id = @id or count(.//structure[@id=$current_structure_id])=1">active</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>passive</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <li class="{$li_style}">
         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show = 1">
            <!-- Определяем адрес ссылки -->
            <xsl:variable name="link">
               <xsl:choose>
                  <!-- Если внешняя ссылка -->
                  <xsl:when test="url != ''">
                     <xsl:value-of disable-output-escaping="yes" select="url"/>
                  </xsl:when>
                  <!-- Иначе если внутренняя ссылка -->
                  <xsl:otherwise>
                     <xsl:value-of disable-output-escaping="yes" select="link"/>
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:variable>
            
            <a href="{$link}" class="{$a_style}">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </xsl:if>
         
         <!-- Выбираем подузлы структуры -->
         <xsl:if test="count(child::*[show=1]) &gt; 0">
            <ul class="acitem {$ul_style}">
               <!-- Выбираем узлы структуры -->
               <xsl:apply-templates select="child::*[show=1]"/>
            </ul>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>

Там, думаю, разберётесь?
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: Re: XSL проверка активного пункта меню
должно получиться
Знания имеют свои пределы, и только глупость человеческая не знает границ...
Авторизация