Помогите с меню

#
Помогите с меню
Здравствуйте!
Плохо разбираюсь в XSL.
Требуется вертикальное меню с выпадающими подкатегориями и субкатегориями. При нажатии на категорию показывается список подкатегорий и происходит переход на категорию, при нажатии на подкатегорию, происходит переход на подкатегорию и  показывается список субкатегорий, при нажатии на субкатегорию, переход осуществляется в субкатегорию соответственно.
И при этом при нажатии на категорию, все остальные категории в меню должны исчезать, кроме самой категории и 1 ссылки на главную страницу.
Помогите!
Заранее благодарен!
#
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 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="/document">

  <ul>
     <!-- Выбираем узлы структуры -->
     <xsl:apply-templates select="structure[show=1]"/>
  </ul>
</xsl:template>

<xsl:template match="structure">
  <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
  <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
<li>
    <!-- Расчитываем размер отступа -->
  <xsl:variable name="padding" select="level * 10" />
       <!-- Показывать ссылку, или нет -->
     <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="external_link"/></xsl:when>
           <!-- Иначе если внутренняя ссылка -->
           <xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
        </xsl:choose></xsl:variable>
                <!-- Определяем стиль вывода ссылки -->
        <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:choose>
           <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
           <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
           <a href="{$link}"><font color="#942121"><xsl:value-of disable-output-escaping="yes" select="name"/></font></a></xsl:when>
           <!-- Иначе обычный вывод с пустым стилем -->
           <xsl:otherwise>
                                 <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
                                            </xsl:otherwise>
        </xsl:choose>
             </xsl:if>
          <!-- Если не показывать ссылку - выводим просто имя ссылки -->
     <xsl:if test="show_link=0">
        <xsl:value-of disable-output-escaping="yes" select="name"/>
     </xsl:if>
</li>

<xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
  <!-- Выбираем подузлы структуры -->
  <xsl:if test="count(structure[show=1]) > 0">
  <ul>
     <!-- Выбираем узлы структуры -->
     <xsl:apply-templates select="structure[show=1]"/>
       </ul>
</xsl:if>
</xsl:if>

</xsl:template>
</xsl:stylesheet>
#
Re: Помогите с меню
   ПРЕДУПРЕЖЕДЕНИЕ: XSLTProcessor::transformToDoc() [function.XSLTProcessor-transformToDoc]: runtime error: file ....../ line 53 element if в файле modules/Xsl/Xsl.class.php (строка 200)

не хочет )
плюс при нажатии на субкатегорию из меню она пропадает, остаются только категории
#
Re: Помогите с меню
Проблема с определением переменной. Замените строки:
<xsl:template match="structure">
<li>
  <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
  <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>

на:
<xsl:template match="structure">
<!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
  <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
<li>
#
Re: Помогите с меню
БОЛЬШОЕ СПАСИБО!
Можно еще вопрос вдогонку? Почему у меня новости и статьи имеют ссылки типа http://vlasti_indonezii_zapretili_polety_bjudzhetnojj_aviakompanii/
а не нормально, с адресом сайта?
#
Re: Помогите с меню
проверьте, чтобы в доменах у сайта стояла галочка "использовать по умолчанию"
#
Re: Помогите с меню
intsib, думаю, что проблема в том, что при редактировании инфосистем "новости" и "статьи" в списке "Узел структуры" выбрана главная страница. Необходимо выбрать соответствующие узлы для данных инфосистем.  
#
Re: Помогите с меню
natalya, как мне разделить оформление <td> внешних ссылок и внутренних? Мне надо чтобы они были разные, но получается, что внутренние ссылки имеют такую же таблицу как и внутренние
#
Re: Помогите с меню
* как и внешние
#
Re: Помогите с меню
intsib, только там не <td>, а <li>. Или я Вас неправильно поняла?
В любом случае, можно воспользоваться проверкой на значение текущего уровня. В css для макета должен быть определен класс sub для вывода внутренних ссылок в виде элементов списка. Например:

<xsl:template match="structure">

        <xsl:variable name="li_class"><xsl:choose>
            <xsl:when test="level > 0">sub</xsl:when>
           <xsl:otherwise></xsl:otherwise>
        </xsl:choose></xsl:variable>

<li class="{$li_class}">
...
</li>
Авторизация