Нестандартное меню

#
Re: Нестандартное меню
К последнему шаблону вопрос:
как можно сделать проверку на наличие подразделов?
в зависимости от наличия подразделов я по-разному вывожу заголовок раздела.

Я вроде решил вопрос таким образом:

<?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:variable name="current_id_pos"  select="@id" />

<!--загоняю в переменную результат построения подразделов -->
<xsl:variable name="sublink">
<xsl:apply-templates select="structure[show=1]" mode="child_nodes"/>
</xsl:variable>   

<!-- проверяю результат построения подразделов и в зависимости от него выбираю стиль отображения
для заголовка раздела  (div_style) и обработчик для ссылки (link_action) -->
<xsl:variable name="div_style">
   <xsl:choose>
      <xsl:when test="$sublink!=''">menu_str</xsl:when>
      <xsl:otherwise>menu</xsl:otherwise>
   </xsl:choose>
</xsl:variable>
<xsl:variable name="link_action">
   <xsl:choose>
      <xsl:when test="$sublink!=''">process_open_table(<xsl:value-of disable-output-escaping="yes" select="$current_id_pos"/>); return false;</xsl:when>
      <xsl:otherwise> </xsl:otherwise>
   </xsl:choose>
</xsl:variable>

<!--Вывожу заголовок раздела -->
<div class="{$div_style}">
   <div class="repad"  id="repad{$current_id_pos}">  
   
   <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>
      
        <a href="{$link}" OnClick="{$link_action}">
      <span>
      <xsl:value-of disable-output-escaping="yes" select="name"/>
      </span></a>
      </xsl:if>

      <!-- Если не показывать ссылку - выводим просто имя ссылки -->
      <xsl:if test="show_link=0">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>
      </div>
      </div>
      
   <!--далее вывожу подразделы если они есть -->   
<xsl:if test="$sublink!=''">
<div class="open_table" id="open_table_{$current_id_pos}">
<ul>
<xsl:apply-templates select="structure[show=1]" mode="child_nodes"/>
</ul>
</div>      
</xsl:if>

</xsl:template>

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

        <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
      </xsl:if>

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

</xsl:stylesheet>


но таким образом я дважды вызываю шаблон
<xsl:apply-templates select="structure[show=1]" mode="child_nodes"/>

что не кажется мне рациональным.
С другой стороны вот такая запись

<xsl:if test="$sublink!=''">
<div class="open_table" id="open_table_{$current_id_pos}">
<ul>
<xsl:value-of disable-output-escaping="yes" select="$sublink"/>
</ul>
</div>      
</xsl:if>

выводит мне только названия подразделов без тегов html-разметки

Что я делаю не так?
Заказов не беру. Консультирую редко.
#
Re: Нестандартное меню
посмотреть есть или нет дочерние разделы можно с использованием функции count. Посмотрите пример ее работы, она встречается во многих xsl шаблонах.
#
Re: Нестандартное меню
пасиба, нашел )
Заказов не беру. Консультирую редко.
Авторизация