Предлагаем готовый XSL-шаблон для показа в результатах поиска не только строкой ссылки на страницу с товаром, но и вывод самих товаров.
Вывод строковых ссылок можно закомментировать, если вы хотите показывать посетителям в результатах поиска только товары.
Шаблон вывода непосредственно товара редактируется согласно вашему дизайну и вашим CSS стилям.
<?xml version= "1.0» encoding= "utf-8"?>
<!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= "utf-8" indent= "yes"
method= "html" omit-xml-declaration= "no" version= "1.0" media-type= "text/xml"/>
<xsl:decimal-format name= "my" decimal-separator="," grouping-separator=""/>
<xsl:template match="/">
<xsl:apply-templates select="/site"/>
</xsl:template>
<xsl:template match="/site">
<!-- Форма поиска -->
<form method= "get" action="/search/">
<input id= "search_text" type= "text" size= "80" name= "text"
value="{query}" maxlength= "200" class= "input_buttom_search"/> 
<input type= "submit" class= "input_buttom_search_button" value= "Искать"/>
</form>
<xsl:if test= "query!=''">
<p>
<strong>Найдено <xsl:value-of select= "total"/> 
<xsl:call-template name= "declension">
<xsl:with-param name= "number" select= "total"/>
</xsl:call-template></strong>
</p>
<xsl:if test= "total!=0">
<div class= "shop_block">
<div class= "shop_table">
<ol start="{ (page) * limit + 1}">
<xsl:apply-templates select= "search_page">
</xsl:apply-templates>
</ol>
</div>
</div>
<!-- Строка ссылок на другие страницы результата поиска -->
<p>
<xsl:variable name= "count_pages" select= "ceiling (total div limit)"/>
<xsl:variable name= "visible_pages" select= "5"/>
<xsl:variable name= "real_visible_pages"><xsl:choose>
<xsl:when test="$count_pages < $visible_pages">
<xsl:value-of select="$count_pages"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="$visible_pages"/></xsl:otherwise>
</xsl:choose></xsl:variable>
<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name= "pre_count_page"><xsl:choose>
<xsl:when test=" (page) — (floor ($real_visible_pages div 2)) < 0">
<xsl:value-of select= "page"/>
</xsl:when>
<xsl:when test=" ($count_pages — (page) — 1) < floor ($real_visible_pages div 2)">
<xsl:value-of select="$real_visible_pages — ($count_pages — (page) — 1) — 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test= "round ($real_visible_pages div 2) = $real_visible_pages div 2">
<xsl:value-of select= "floor ($real_visible_pages div 2) — 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "floor ($real_visible_pages div 2)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose></xsl:variable>
<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name= "post_count_page"><xsl:choose>
<xsl:when test= "0 > (page) — (floor ($real_visible_pages div 2) — 1)">
<xsl:value-of select="$real_visible_pages — (page) — 1"/>
</xsl:when>
<xsl:when test=" ($count_pages — (page) — 1) < floor ($real_visible_pages div 2)">
<xsl:value-of select="$real_visible_pages — $pre_count_page — 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$real_visible_pages — $pre_count_page — 1"/>
</xsl:otherwise>
</xsl:choose></xsl:variable>
<xsl:variable name= "i"><xsl:choose>
<xsl:when test=" (page) + 1 = $count_pages">
<xsl:value-of select=" (page) — $real_visible_pages + 1"/></xsl:when>
<xsl:when test=" (page) — $pre_count_page > 0">
<xsl:value-of select=" (page) — $pre_count_page"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose></xsl:variable>
<xsl:call-template name= "for">
<xsl:with-param name= "limit" select= "limit"/>
<xsl:with-param name= "page" select= "page"/>
<xsl:with-param name= "total" select= "total"/>
<xsl:with-param name= "i" select="$i"/>
<xsl:with-param name= "post_count_page" select="$post_count_page"/>
<xsl:with-param name= "pre_count_page" select="$pre_count_page"/>
<xsl:with-param name= "visible_pages" select="$real_visible_pages"/>
</xsl:call-template>
<div style= "clear: both"></div>
</p>
</xsl:if>
</xsl:if>
<xsl:if test= "query = ''">
<p>Введите поисковой запрос.</p>
</xsl:if>
</xsl:template>
<xsl:template match= "search_page">
<xsl:choose>
<!-- Если магазин (module = 3) и тип элемента товары (module_value_type = 2) -->
<xsl:when test= "module = 3 and module_value_type = 2">
<xsl:apply-templates select= "shop_item" mode= "shop" />
</xsl:when>
<xsl:otherwise>
<div class= "shop-search_pages">
<a href="{url}">
<xsl:value-of select= "title"/>
</a>
<br/>
<xsl:apply-templates select= "url"/>
 ·  <xsl:value-of select= "size"/> Кб · 
<xsl:value-of select= "date"/>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон для товара -->
<xsl:template match= "shop_item" mode= "shop" >
<div class= "shop_item">
<div class= "shop_table_item">
<div class= "image_row">
<div class= "image_cell">
<a href="{url}">
<xsl:choose>
<xsl:when test= "image_small! = ''">
<img src="{dir}{image_small}" alt="{name}" title="{name}"/>
</xsl:when>
<xsl:otherwise>
<img src="/images/no-image.png" alt="{name}" title="{name}"/>
</xsl:otherwise>
</xsl:choose>
</a>
</div>
</div>
<div class= "description_row">
<div class= "description_sell">
<div class= "name">
<xsl:value-of disable-output-escaping= "yes" select= "name"/>
</div>
<div class= "price">
<!-- Цена товара -->
<xsl:choose>
<xsl:when test= "price! = 0">
<span><xsl:value-of select= "format-number (price, '### ##0', 'my')"/>
<xsl:text> </xsl:text><xsl:value-of select= "currency"/>
<xsl:text> </xsl:text></span>
</xsl:when>
<!-- Если цена со скидкой — выводим ее -->
<xsl:when test= "price_tax! = price">
<span class= "oldPrice">
<xsl:value-of select= "format-number (price_tax, '### ##0', 'my')"/>
<xsl:text> </xsl:text><xsl:value-of select= "currency" />
</span><xsl:text> </xsl:text></xsl:when>
<xsl:otherwise><span>под заказ</span></xsl:otherwise>
</xsl:choose>
</div>
</div>
</div>
</div>
</div>
<xsl:if test= "position () mod 3 = 0 and position ()! = last ()">
<div class= "clear" style= "height:16px;"></div>
</xsl:if>
</xsl:template>
<xsl:template name= "url" match= "text ()">
<xsl:param name= "str" select="."/>
<xsl:param name= "max">50</xsl:param>
<xsl:param name= "hvost">10</xsl:param>
<xsl:param name= "begin">
<xsl:choose>
<xsl:when test= "string-length ($str) > $max">
<xsl:value-of select= "substring ($str, 1, $max — $hvost)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "substring ($str, 1)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:param>
<xsl:param name= "end">
<xsl:choose>
<xsl:when test= "string-length ($str) > $max">
<xsl:value-of select= "substring ($str, string-length ($str) — $hvost + 1, $hvost)"/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:param>
<xsl:param name= "result">
<xsl:choose>
<xsl:when test="$end! = ''">
<xsl:value-of select= "concat ($begin, '…', $end)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$begin"/>
</xsl:otherwise>
</xsl:choose>
</xsl:param>
<xsl:value-of disable-output-escaping= "yes" select="$result"/>
</xsl:template>
<!-- Цикл для вывода строк ссылок -->
<xsl:template name= "for">
<xsl:param name= "i" select= "0"/>
<xsl:param name= "limit"/>
<xsl:param name= "page"/>
<xsl:param name= "total"/>
<xsl:param name= "visible_pages"/>
<xsl:variable name= "url" select="/site/url"/>
<xsl:variable name= "n" select="$total div $limit"/>
<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name= "pre_count_page">
<xsl:choose>
<xsl:when test="$page > ($n — (round ($visible_pages div 2) — 1))">
<xsl:value-of select="$visible_pages — ($n — $page)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "round ($visible_pages div 2) — 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name= "post_count_page">
<xsl:choose>
<xsl:when test= "0 > $page — (round ($visible_pages div 2) — 1)">
<xsl:value-of select="$visible_pages — $page"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test= "round ($visible_pages div 2) = ($visible_pages div 2)">
<xsl:value-of select="$visible_pages div 2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select= "round ($visible_pages div 2) — 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$i = 0 and $page! = 0">
<span class= "ctrl">
← Ctrl
</span>
</xsl:if>
<xsl:if test="$i >= $n and ($n — 1) > $page">
<span class= "ctrl">
Ctrl -->
</span>
</xsl:if>
<xsl:if test="$total > $limit and $n > $i">
<!-- Определяем адрес ссылки -->
<xsl:variable name= "number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test="$i! = 0">page-<xsl:value-of select="$i + 1"/>/</xsl:when>
<!-- Иначе если нулевой уровень — просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Ставим ссылку на страницу-->
<xsl:if test="$i! = $page">
<!-- Выводим ссылку на первую страницу -->
<xsl:if test="$page — $pre_count_page > 0 and $i = 0">
<a href="{$url}?text={/site/queryencode}"
class= "page_link" style= "text-decoration: none;">←</a>
</xsl:if>
<xsl:choose>
<xsl:when test="$i >= ($page — $pre_count_page)
and ($page + $post_count_page) >= $i">
<!-- Выводим ссылки на видимые страницы -->
<a href="{$url}{$number_link}?text={/site/queryencode}" class= "page_link">
<xsl:value-of select="$i + 1"/>
</a>
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
<!-- Выводим ссылку на последнюю страницу -->
<xsl:if test="$i+1 >= $n and $n > ($page + 1 + $post_count_page)">
<xsl:choose>
<xsl:when test="$n > round ($n)">
<!-- Выводим ссылку на последнюю страницу -->
<a href="{$url}page-{round ($n+1)}/?text={/site/queryencode}"
class= "page_link" style= "text-decoration: none;">--></a>
</xsl:when>
<xsl:otherwise>
<a href="/page-{round ($n)}/?text={/site/queryencode}"
class= "page_link" style= "text-decoration: none;">--></a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:if>
<!-- Ссылка на предыдущую страницу для Ctrl + влево -->
<xsl:if test="$page! = 0 and $i = $page">
<xsl:variable name= "prev_number_link">
<xsl:choose>
<!-- Если не нулевой уровень -->
<xsl:when test=" ($page)! = 0">page-<xsl:value-of select="$i"/>/</xsl:when>
<!-- Иначе если нулевой уровень — просто ссылка на страницу со списком элементов -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<a href="{$url}{$prev_number_link}?text={/site/queryencode}" id= "id_prev"></a>
</xsl:if>
<!-- Ссылка на следующую страницу для Ctrl + вправо -->
<xsl:if test=" ($n — 1) > $page and $i = $page">
<a href="{$url}page-{$page+2}/?text={/site/queryencode}" id= "id_next"></a>
</xsl:if>
<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $page">
<span class= "current">
<xsl:value-of select="$i+1"/>
</span>
</xsl:if>
<!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
<xsl:call-template name= "for">
<xsl:with-param name= "i" select="$i + 1"/>
<xsl:with-param name= "limit" select="$limit"/>
<xsl:with-param name= "page" select="$page"/>
<xsl:with-param name= "total" select="$total"/>
<xsl:with-param name= "visible_pages" select="$visible_pages"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Склонение после числительных -->
<xsl:template name= "declension">
<xsl:param name= "number" select= "number"/>
<!-- Именительный падеж -->
<xsl:variable name= "nominative">
<xsl:text>страница</xsl:text>
</xsl:variable>
<!-- Родительный падеж, единственное число -->
<xsl:variable name= "genitive_singular">
<xsl:text>страницы</xsl:text>
</xsl:variable>
<xsl:variable name= "genitive_plural">
<xsl:text>страниц</xsl:text>
</xsl:variable>
<xsl:variable name= "last_digit">
<xsl:value-of select="$number mod 10"/>
</xsl:variable>
<xsl:variable name= "last_two_digits">
<xsl:value-of select="$number mod 100"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$last_digit = 1 and $last_two_digits! = 11">
<xsl:value-of select="$nominative"/>
</xsl:when>
<xsl:when test="$last_digit = 2 and $last_two_digits! = 12
or $last_digit = 3 and $last_two_digits! = 13
or $last_digit = 4 and $last_two_digits! = 14">
<xsl:value-of select="$genitive_singular"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$genitive_plural"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>