XSL-шаблон для меню - вопрос

#
XSL-шаблон для меню - вопрос
Для удобства разделения на языковые версии запихала все английские узлы структуры в отдельное меню, корневой раздел которого - /eng/
Для русской версии использую такой шаблон меню (с выводом узлов структуры второго уровня):


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

   <xsl:template match="structure">

      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
            <!-- Показывать ссылку, или нет -->
            <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">act</xsl:when>
                     <!-- Иначе обычный вывод с пустым стилем -->
                     <xsl:otherwise></xsl:otherwise>
                  </xsl:choose>
               </xsl:variable>
               <a href="{$link}" class="menuPic" title="{name}">
                    <xsl:if test="propertys/property[@xml_name='menuPic']/value!=''">
                      <img src="{propertys/property[@xml_name='menuPic']/value}" alt="{name}" width="130" class="{$link_style}"/>
                    </xsl:if>
                    </a>
                    <div class="menuTxt">
                      <h3><a href="{$link}" class="{$link_style}">
                        <xsl:value-of disable-output-escaping="yes" select="name"/>
                      </a></h3>
                      <!-- Выводим подуровни меню -->
               <xsl:if test="count(structure[show = 1]) &gt; 0">
                  <xsl:apply-templates select="structure[show=1]" mode="pool"/>
               </xsl:if>
                    </div>
                    <div class="forClear"></div>
            </xsl:if>
            

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

   <xsl:template match="structure" mode="pool">
      <p>
         <!-- Показывать ссылку, или нет -->
         <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:choose>
                        <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
                        <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
                            <a href="{$link}" class="act">
                                <xsl:value-of disable-output-escaping="yes" select="name"/>
                            </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>
      </p>
   </xsl:template>
</xsl:stylesheet>

Вопрос - как изменить этот шаблон для английского меню, чтобы выводились пункты второго (которые внутри /eng/) уровня - как первый уровень в русском меню, а третьего уровня (допустим, /eng/news/2010/) - как второй уровень в русском меню?

Самый верхний уровень - /eng/ - вообще в английском меню отображаться не должен.
http://superweb.pro/ — сайты на HostCMS под ключ
Модератор
#
Re: XSL-шаблон для меню - вопрос
plasmamedia,
Можно определять в структуре и через внешние параметры отображать:
http://www.hostcms.ru/forums/22/2763/
http://www.hostcms.ru/forums/17/1931/

plasmamedia писал(а):
Для удобства разделения на языковые версии запихала все английские узлы структуры в отдельное меню, корневой раздел которого — /eng/

Тогда зачем все эти решения? Почему бы просто не выводить русское или английское меню по их ID?
#
Re: XSL-шаблон для меню - вопрос
HostCMS писал(а):
Тогда зачем все эти решения? Почему бы просто не выводить русское или английское меню по их ID?


Именно по ID и вывожу. И получается, что у английского меню ОДИН раздел верхнего уровня - а все остальные его подразделы. А мне нужно, чтобы /eng/ игнорировался вообще, все что в нем - считалось разделами верхнего уровня, с соответствующими подразделами внутри.

Ухищрения - как раз ради ссылки-переключателя, подобно описанной вам. Но мне не хочется засовывать русскую часть в ru - хочется, чтобы она была в корне.

Переключатель в макете прекрасно работает, реализовано так:

В русской версии

<?php
$structure = new Structure();
$structure_id = CURRENT_STRUCTURE_ID;
$type = 0;
$path = $structure->GetStructurePath($structure_id, $type);
?>

<select name="jumpMenu" id="jumpMenu" onChange="MM_jumpMenu('parent',this,1)">
   <option value="/<?php echo($path); ?>">русский</option>
   <option value="/eng/<?php echo($path); ?>">english</option>
</select>


В английской версии

<?php
$structure = new Structure();
$structure_id = CURRENT_STRUCTURE_ID;
$type = 0;
$path = $structure->GetStructurePath($structure_id, $type);
$rusLength = strlen($path) - 4;
$rusPath = substr($path,4,$rusLength);
?>

<select name="jumpMenu" id="jumpMenu" onChange="MM_jumpMenu('parent',this,1)">
         <option value="/<?php echo($path); ?>">english</option>
         <option value="/<?php echo($rusPath); ?>">russian</option>
      </select>


Переключатель-то как раз работает идеально. Проблема у меня как всегда с XSL... не понимаю, как его заставить считать верхним уровнем только то, что после /eng/
http://superweb.pro/ — сайты на HostCMS под ключ
Авторизация