Расширенный вывод информации о проиндексированных элементах

Контроллер поиска представляет проиндексированные страницы в тегах search_page, каждый из которых может содержать дочерний элемент, тег которого зависит от типа проиндексированного контента.

Стандартная структура XSL-шаблона имеет следующий вид:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:hostcms="https://www.hostcms.ru/"
    exclude-result-prefixes="hostcms">
    <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:template match="/">
        <xsl:apply-templates select="/site"/>
    </xsl:template>

    <xsl:template match="/site">
        <h1>Поиск</h1>

        <!-- Форма поиска -->
        <form method="get" action="/search/" class="search">
            <input id="search" type="text" size="50" name="text" value="{query}" maxlength="200" class="input_buttom_search"/><xsl:text> </xsl:text>
            <input type="submit" class="button" value="Искать"/>
        </form>

        <xsl:if test="query!=''">
            <p>
                <strong>Найдено <xsl:value-of select="total"/><xsl:text> </xsl:text><xsl:call-template name="declension">
                <xsl:with-param name="number" select="total"/></xsl:call-template></strong>.</p>

            <xsl:if test="total!=0">
                <ol start="{(page) * limit + 1}" class="search">
                    <xsl:apply-templates select="search_page"></xsl:apply-templates>
                </ol>
            </xsl:if>
        </xsl:if>

        <xsl:if test="query = ''">
            <p>Введите поисковой запрос.</p>
        </xsl:if>
    </xsl:template>

    <xsl:template match="search_page">
        <li>
            <a href="{url}">
                <xsl:value-of select="title"/>
            </a>
            <br/>
            <span class="description"><xsl:apply-templates select="url"/><xsl:text> · </xsl:text><xsl:value-of select="round(size div 1024)"/><xsl:text> Кб · </xsl:text><xsl:value-of select="date"/></span>    
        </li>
    </xsl:template>

    <xsl:template name="url" match="text()">
        ...
    </xsl:template>

    <!-- Цикл для вывода строк ссылок -->
    <xsl:template name="for">
        ...
    </xsl:template>

    <!-- Склонение после числительных -->
    <xsl:template name="declension">
        ...
    </xsl:template>
</xsl:stylesheet>

Вывод дополнительной информации о проиндексированном элементе

Дочерний тег, расположенный внутри search_page, зависит от типа проиндексированного контента и может иметь имя structure, informationsystem_item, informationsystem_group, shop_item, shop_group и т.д.

Предположим нам необходимо вывести подробную информацию о проиндексированном товаре, для этого вначале необходимо проверить на наличие дочернего тега с определенным именем и далее вывести информацию, за основу можно взять фрагмент XSL-шаблона вывода информации о товаре.

<xsl:template match="search_page">
    <li>
        <a href="{url}">
            <xsl:value-of select="title"/>
        </a>
        <br/>
<span class="description"><xsl:apply-templates select="url"/><xsl:text> · </xsl:text><xsl:value-of select="round(size div 1024)"/><xsl:text> Кб · </xsl:text><xsl:value-of select="date"/></span>
        
        <!-- Если проиндексирован товар -->
        <xsl:if test="shop_item/node()">
            <xsl:apply-templates select="shop_item"></xsl:apply-templates>
        </xsl:if>
    </li>
</xsl:template>

<!-- Формат вывода чисел -->
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>

<!-- Шаблон вывода дополнительной информации о товаре -->
<xsl:template match="shop_item">
    <p><a href="{dir}{image_large}" target="_blank"><img src="{dir}{image_small}" /></a></p>
    
    <!-- Цена товара -->
    <xsl:if test="price != 0">
        <div class="price">
            <xsl:value-of select="format-number(price, '### ##0,00', 'my')"/><xsl:text> </xsl:text><xsl:value-of select="currency"/><xsl:text> </xsl:text>

            <!-- Если цена со скидкой - выводим ее -->
            <xsl:if test="discount != 0">
                <span class="oldPrice">
                    <xsl:value-of select="format-number(price + discount, '### ##0,00', 'my')"/><xsl:text> </xsl:text><xsl:value-of select="currency" />
                </span><xsl:text> </xsl:text>
            </xsl:if>

            <!-- Ссылку на добавление в корзины выводим, если:
    type = 0 - простой тип товара
    type = 1 - электронный товар, при этом остаток на складе больше 0 или -1,
    что означает неограниченное количество -->
            <xsl:if test="type = 0 or (type = 1 and (digitals > 0 or digitals = -1)) or type = 2">
                <a href="{/shop/url}cart/?add={@id}" onclick="return $.addIntoCart('{/shop/url}cart/', {@id}, 1)">
                    <img src="/images/add_to_cart.gif" alt="Добавить в корзину" title="Добавить в корзину" />
                </a>
            </xsl:if>
        </div>
    </xsl:if>
</xsl:template>

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.