Карта сайта

Модератор
#
Карта сайта
Новая редакция 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 method="html" indent="yes" encoding="Windows-1251"/>

<xsl:template match="/document">

   <h1>Карта сайта</h1>

   <table border="0" cellspacing="0" cellpadding="0" style="margin-left:4px; margin-right:4px;">
   <tr>
   <td valign="top" width="50%">
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="//structure"/>
   </td>
   </tr>
   </table>

</xsl:template>

<xsl:template match="structure">
   
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
   
   <!-- Расчитываем размер отступа -->
   <xsl:variable name="padding" select="level * 10" />
   
   <div style="padding-left: {$padding}px; margin-bottom: 3px;">
   
      <!-- Показывать ссылку, или нет -->
      <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="is_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>
         
         <img border="0" src="/images/menu_point.gif" class="menu_point" width="4" height="7" />
         <a href="{$link}"><span style="{$link_style}"><xsl:value-of disable-output-escaping="yes" select="name"/></span></a>
      </xsl:if>
      
      <!-- Если не показывать ссылку - выводим просто имя ссылки -->
      <xsl:if test="show_link=0">
         <img border="0" src="/images/menu_point.gif" class="menu_point" width="4" height="7" />
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>

   </div>
   
   <!-- ЕСЛИ ДОШЛИ ДО СЕРЕДИНЫ СПИСКА -->
   
   <!-- Если не надо разравать колонку на вторых уровнях, то указать: -->
   <!-- <xsl:if test="level = 0 and position() = round(count(/document/structure) div 2)"> -->
   
   <xsl:if test="position() = round(count(/document//structure) div 2)">
      <xsl:text disable-output-escaping="yes">
      <![CDATA[
      <!-- Закрываем таблицу левой колонки -->
      </td>
      <td valign="top" width="50%">
      ]]>
      </xsl:text>
   </xsl:if>

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


Комментарии:

1. Если нужно выводить только видимые пункты меню, то вместо:
<xsl:apply-templates select="//structure"/>

указываем
<xsl:apply-templates select="//structure[show=1]"/>


2. Если не надо разравать колонку на вторых уровнях, то указать:
<xsl:if test="position() = round(count(/document//structure) div 2)">

вместо
<xsl:if test="level = 0 and position() = round(count(/document/structure) div 2)">
Авторизация