Решение проблемы длинных url ввыдаче модуля поиска
natalya
4 сентября 2007 г.
Очень часто при использовании поиска по сайту на выдаче формируется список, содержащий ссылки на найденные страницы, а также полные пути к этим страницам. Как правило строки, содержащие эти пути имеют большую длину, что осложняет просмотр всего списка. Есть возможность модифицировать xsl-шаблон "Поиск" таким образом, что если длина строки с полным адресом превышает, например, 50 символов, то из начальной последовательности символов и конечной последовательности символов этой строки, а также символа "..." будет формироваться новая. Именно эта строка будет отображаться в выдаче. Внесенные изменения в xsl-шаблон "Поиск" выделены жирным шрифтом.
<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="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/document">
<!-- Форма поиска -->
<form method="get" action="/search/" style="margin-top: 10px;">
<input type="text" size="50" name="text" value="{search_query}" maxlength="200" class="input_buttom_search"/>
<input type="submit" class="input_buttom_search_button" value="Искать"/>
</form>
<xsl:if test="search_query!=''">
<p><strong>Всего найдено: <xsl:value-of select="count_items"/></strong></p>
<xsl:if test="count_items!=0">
<ol start="{(current_page - 1) * items_on_page + 1}">
<xsl:apply-templates select="item">
</xsl:apply-templates>
</ol>
<!-- Строка ссылок на другие страницы результата поиска -->
<center>
<xsl:call-template name="for">
<xsl:with-param name="n" select="count_items div items_on_page"/>
<xsl:with-param name="current_page" select="current_page - 1"/>
</xsl:call-template>
</center>
</xsl:if>
</xsl:if>
<xsl:if test="search_query = ''">
<p>Введите поисковой запрос.</p>
</xsl:if>
</xsl:template>
<xsl:template name="page_address" 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 match="item">
<li>
<a href="{page_address}" class="small_link"><xsl:value-of select="page_name"/></a>
<br/>
<xsl:apply-templates select="page_address" />
· <xsl:value-of select="page_size"/> Кб · <xsl:value-of select="page_date"/>
</li>
</xsl:template>
<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<xsl:param name="current_page"/>
<!-- Если найдено больше, чем одна страница -->
<xsl:if test="$n > 1">
<xsl:if test="$n > $i">
<!-- Разделитель ссылок -->
<xsl:if test="$i != 0 and $n > $current_page"> - </xsl:if>
<!-- Ставим ссылку на страницу-->
<xsl:if test="$i != $current_page">
<!-- Определяем адрес ссылки -->
<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>
<a href="./?text={search_query_url}{$number_link}" class="small_link"><xsl:value-of select="$i+1"/></a>
</xsl:if>
<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $current_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="n" select="$n"/>
<xsl:with-param name="current_page" select="$current_page"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<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="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/document">
<!-- Форма поиска -->
<form method="get" action="/search/" style="margin-top: 10px;">
<input type="text" size="50" name="text" value="{search_query}" maxlength="200" class="input_buttom_search"/>
<input type="submit" class="input_buttom_search_button" value="Искать"/>
</form>
<xsl:if test="search_query!=''">
<p><strong>Всего найдено: <xsl:value-of select="count_items"/></strong></p>
<xsl:if test="count_items!=0">
<ol start="{(current_page - 1) * items_on_page + 1}">
<xsl:apply-templates select="item">
</xsl:apply-templates>
</ol>
<!-- Строка ссылок на другие страницы результата поиска -->
<center>
<xsl:call-template name="for">
<xsl:with-param name="n" select="count_items div items_on_page"/>
<xsl:with-param name="current_page" select="current_page - 1"/>
</xsl:call-template>
</center>
</xsl:if>
</xsl:if>
<xsl:if test="search_query = ''">
<p>Введите поисковой запрос.</p>
</xsl:if>
</xsl:template>
<xsl:template name="page_address" 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 match="item">
<li>
<a href="{page_address}" class="small_link"><xsl:value-of select="page_name"/></a>
<br/>
<xsl:apply-templates select="page_address" />
· <xsl:value-of select="page_size"/> Кб · <xsl:value-of select="page_date"/>
</li>
</xsl:template>
<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<xsl:param name="current_page"/>
<!-- Если найдено больше, чем одна страница -->
<xsl:if test="$n > 1">
<xsl:if test="$n > $i">
<!-- Разделитель ссылок -->
<xsl:if test="$i != 0 and $n > $current_page"> - </xsl:if>
<!-- Ставим ссылку на страницу-->
<xsl:if test="$i != $current_page">
<!-- Определяем адрес ссылки -->
<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>
<a href="./?text={search_query_url}{$number_link}" class="small_link"><xsl:value-of select="$i+1"/></a>
</xsl:if>
<!-- Не ставим ссылку на страницу-->
<xsl:if test="$i = $current_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="n" select="$n"/>
<xsl:with-param name="current_page" select="$current_page"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Авторизация