Карта сайта
hostcms
Модератор
7 октября 2006 г.
Новая редакция XSL-шаблона для карты сайта:
Комментарии:
1. Если нужно выводить только видимые пункты меню, то вместо:
указываем
2. Если не надо разравать колонку на вторых уровнях, то указать:
вместо
<?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>
<!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)">
Авторизация