вторник, 24 июня 2008 г.

MOSS 2007 customization search

Организация расширенного поиска в MOSS 2007
Руководство по развертыванию расширенного поиска для внедренцев

Автор: Коротенко Владимир Николаевич
Yappi.biz

Источник: http://mossdevel.blogspot.com
Опубликовано: 11.06.2008
Версия текста: 1.0

Введение

Целью данного решение является предоставление законченного решения для организации поиска по дополнительным аргументам документа в библиотеке MOSS 2007.

В ходе разработки данного внедрения будут освещены вопросы создания библиотеки документов с дополнительными атрибутами и организация поиска по этим атрибутам.

MOSS предоставляет очень мощьный и одновременно гибкий механизм поиска. Большинство стандартных форматов офисных файлов индексируются по умолчанию, и предоставляет очень удобный механизм для извлечения данных.

Кратко алгоритм добавления нового поля можно описать так:

  • Добавление нового типа столбца в определение сайта
  • Создание библиотеки или списка содержащих этот столбец
  • Обход содержимого, для внесения информации о добавленном столбце
  • Сопоставление метаданных для обеспечения поиска по данному столбцу
  • Создание сайта и страниц для поиска
  • Настройка файла определения для формы расширенного поиска
  • Настройка фильтруемых столбцов при отображении
  • Настройка шаблона для вывода результатов поиска

Создание узла для кастомизации поиска

Создайте узел с помощью следующих действий:

  • В меню Действия узла выберите пункт создать веб узел
  • Заполните поля для вновь создаваемого узла (Название и описание, Адрес веб-узла)
  • Выберите шаблон Центр поиска на вкладке Корпоративный
  • Нажмите кнопку Создать для создания узла.
  • Настройте дополнительную вкладку для обеспечения ваших условий поиска

Ссылка на блог http://www.sharepoint-tips.com/2006/07/found-it-how-to-add-properties-to.html

Модификация столбцов узла

  • Выполните команду Изменение параметров узла выбрав Действия узла \ Параметры узла
  • Перейдите по ссылке Столбцы узла
  • Щелкните по кнопке создать и заполните поля предлагаемые вам

После этого этапа создайте библиотеку содержащую данный тип столбца.

Внесите в данную библиотеку один элемент и переходите к Добавление свойств для поиска в центре поиска

Добавление свойств для поиска в центре поиска

Для проведения данного этапа необходимо произвести полную индексацию содержимого того узла в который был добавлен новый столбец, только после этого появиться возможность его индексировать.

Оригинал данной статьи http://www.codeproject.com/KB/sharepoint/MOSS_Advanced_Search.aspx

  • Перейдите в центр администрирования и выберите пункт настройки общих сервисов для фермы.
  • Перейдите по ссылке Поиск \ Параметры поиска
  • Перейдите по ссылке Сопоставление свойств метаданных
  • Щелкните на кнопке Создать управляемое свойство
  • Выберите имя свойства, укажите тип и щелкните на кнопку добавить сопоставление
  • Укажите имя поля, которое вы определили на этапе модификации столбцов узла для меппинга на это поле
ПРИМЕЧАНИЕ

Обратите внимание что нужные вам категории находятся в категории SharePoint и русские имена полей кодируются в виде значений типа ows_x0414_x0420_2007_x002d_7

Создание вкладки для поиска

Создайте страницы для поиска и результатов поиска с помощью команд меню Действия узла \ Создание страницы

СОВЕТ

В поле URL-имя: лучше вводить полный путь начиная от корня сайта например http://portal/custsearch/result.aspx

Создайте новую вкладку на панели поиска и выберите ссылку добавить вкладку.

Укажите страницу которую вы создали на предыдущем этапе

Сбросьте галочку Показать список выбора языков

Отредактируйте перенаправление на вашу страницу

Настройте правила настройки поиска для отбора различных параметров поиска

Изменение параметров для поисковой формы

Ниже приведен код определения для поискового запроса, после внесения правок в данный документ удалите символы переноса строки. Документ должен быть в одну строку. Ниже приведен код который надо сохранить в файл с расширением .html. внешний вид приведен на рисунке:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <LangDefs>
  <!-- Определения языков для отображения в панели выбора языков -->
  <LangDef DisplayName="финский" LangID="11"/>  
  <LangDef DisplayName="немецкий" LangID="7"/>  
  <LangDef DisplayName="иврит" LangID="13"/>  
  <LangDef DisplayName="латышский" LangID="38"/>
  <LangDef DisplayName="литовский" LangID="39"/>  
  <LangDef DisplayName="русский" LangID="25"/>  
  <LangDef DisplayName="украинский" LangID="34"/>  
 </LangDefs>
 <Languages>
  <!-- Список отображаемых языков для вывода в поле выбора языка -->
  <Language LangRef="11"/>
  <Language LangRef="7"/>
  <Language LangRef="13"/>
  <Language LangRef="38"/>
  <Language LangRef="39"/>
  <Language LangRef="25"/>
  <Language LangRef="34"/>
 </Languages>
 <PropertyDefs>
  <!-- Определения аттрибутов документв для поискового запроса -->
  <!-- <PropertyDef Name="Имя столбца" DataType="тип данных" DisplayName="Имя для отображения на экране"/> -->
  <PropertyDef Name="Path" DataType="text" DisplayName="URL-адрес"/>
  <PropertyDef Name="Size" DataType="integer" DisplayName="Размер"/>
  <PropertyDef Name="Write" DataType="datetime" DisplayName="Дата изменения"/>
  <PropertyDef Name="FileName" DataType="text" DisplayName="Имя"/>
  <PropertyDef Name="Description" DataType="text" DisplayName="Описание"/>
  <PropertyDef Name="Title" DataType="text" DisplayName="Название"/>
  <PropertyDef Name="Author" DataType="text" DisplayName="Автор"/>
  <PropertyDef Name="DocSubject" DataType="text" DisplayName="Тема"/>
  <PropertyDef Name="DocKeywords" DataType="text" DisplayName="Ключевые слова"/>
  <PropertyDef Name="DocComments" DataType="text" DisplayName="Заметки"/>
  <PropertyDef Name="Manager" DataType="text" DisplayName="Руководитель"/>
  <PropertyDef Name="Company" DataType="text" DisplayName="Организация"/>
  <PropertyDef Name="Created" DataType="datetime" DisplayName="Дата создания"/>
  <PropertyDef Name="CreatedBy" DataType="text" DisplayName="Кем создано"/>
  <PropertyDef Name="ModifiedBy" DataType="text" DisplayName="Кем изменено"/>
  <PropertyDef Name="Company" DataType="text" DisplayName="Компания"/>
  <!-- Новый пользовательский столбец с штрих кодом документа -->
  <PropertyDef Name="BarCode" DataType="text" DisplayName="Штрих код"/>
  <!-- Новый пользовательский столбец с именем отдела -->
  <PropertyDef Name="Department" DataType="text" DisplayName="Отдел"/>
 </PropertyDefs>
 <ResultTypes>
  <!-- набор предопределенных типов содержимого для поиска -->
  <!-- 
  Определены 5 типов запросов: запрос без фильтрации,запрос документов, запрос документов Word, 
  запрос таблиц Excel,запрос презентаций 
  -->
  <ResultType DisplayName="Все результаты" Name="default">   
   <Query/>
   <PropertyRef Name="Author" />
   <PropertyRef Name="Description" />
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Company" />
   <PropertyRef Name="Department" />
   <PropertyRef Name="BarCode" />
  </ResultType>
  <ResultType DisplayName="Документы" Name="documents">
   <!-- Условие фильтрации -->
   <Query>IsDocument=1</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
  <ResultType DisplayName="Документы Word" Name="worddocuments">
   <!-- Выборка документов по содержимому -->
   <Query>FileExtension='doc' Or FileExtension='docx' Or FileExtension='dot'</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
  <ResultType DisplayName="Документы Excel" Name="exceldocuments">
   <Query>FileExtension='xls' Or FileExtension='xlsx' Or FileExtension='xlt'</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
  <ResultType DisplayName="Презентации" Name="presentations">
   <Query>FileExtension='ppt'</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
 </ResultTypes>
</root>
ПРИМЕЧАНИЕ

Обратите внимание на то, что после редактирования данного определения вы должны убрать из всего кода переносы, т.е. файл должен быть очищен от символов \r\n, я пользуюсь для данных целей следующим кодом, сохраненным в файл crunch.html

<script type="text/javascript">
function ClearForm()
{
var arr = codes.value.split('\r\n');
var buf = '';
for (i=0; i<arr.length; i++)
{
var b = arr[i].replace(/^\s+/, '');
b.replace(/\s+$/, '');
buf += b;
}
codes.value = buf;
}
</script>

<textarea id="codes" name="codes" rows=20 cols="80">
</textarea>
<input type=button value="Очистить" onclick="ClearForm('codes')"/>

Настройка шаблона для вывода результатов поиска

Механизм поиска в MOSS реализован следующим образом:

  • Формирование поискового запроса в веб части поиска или веб части расширенного поиска с определением результатов поиска и ограничивающими условиями. Данные правила представлены в виде специально оформленного документа XML который содержиться в одном из свойств веб части поиска.
  • Выполнение поискового запроса в соответствии с переданными параметрами поиска
  • Передача результатов поиска в виде документа XML в веб часть отображения результатов поиска.
  • Фильтрация отбираемых столбцов на основе заданных параметров в веб части отображения результатов поиска.
  • Применение шаблона XSLT к результатам поиска для получения представления отображения

Для настройки вывода результатов поиска вам необходимо произвести следующие действия:

  • Определить столбцы, которые будут выводиться в результирующий набор.
  • Отредактировать шаблон для обработки результатов поиска.

Определение столбцов для вывода производится путем изменения свойства веб части Основные результаты поиска.

Выберите пункт настройки веб части щелкнув на треугольнике в правом верхнем углу веб части в режиме редактирования страницы.

Измените набор столбцов на нужный вам при получении результатов.

Ниже приведен код определения столбцов с определением 2 дополнительных столбцов; KvnBarCode и KvnDepartment.

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <Columns>
  <Column Name="WorkId"/>
  <Column Name="Title"/>
  <Column Name="Author"/>
  <Column Name="Path"/>
  <Column Name="Description"/>
  <Column Name="Write"/>
  <Column Name="IsDocument"/>
  <Column Name="KvnBarCode"/>
  <Column Name="KvnDepartment"/>
 </Columns>
</root>
ПРЕДУПРЕЖДЕНИЕ

Внимание после редактирования данного документа удалите все символы переноса строки с помощью файла trim.htm, который описан выше

После определения столбцов перейдите к редактированию шаблона отображения.

Скопируйте исходный код в окно Редактора XSL для отображения результатов поиска.

Первоначально я привожу 2 шаблона для отображения результатов поиска, первый предназначен для тестового использования и выдает код ответа на поисковый запрос без изменения.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
 <xsl:output method="xml" version ="1.0" encoding="UTF-8" indent="yes" /> 
 <xsl:template match="/" >
  <xmp><xsl:copy-of select="*"/> </xmp>
 </xsl:template>

</xsl:stylesheet> 

Второй шаблон предназначен для вывода данных в виде таблицы и применяется для группировки результатов поиска в табличном представлении. Внимательно читайте комментарии написанные по-русски. Так - же приветствуются знание технологии XSL. Краткое руководство по данному языку можно найти по адресу http://www.rol.ru/news/it/helpdesk/xslt01.htm

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
 <xsl:param name="ResultsBy" />
 <xsl:param name="ViewByUrl" />
 <xsl:param name="ViewByValue" />
 <xsl:param name="IsNoKeyword" />
 <xsl:param name="IsFixedQuery" />
 <xsl:param name="ShowActionLinks" />
 <xsl:param name="MoreResultsText" />
 <xsl:param name="MoreResultsLink" />
 <xsl:param name="CollapsingStatusLink" />
 <xsl:param name="CollapseDuplicatesText" />
 <xsl:param name="AlertMeLink" />
 <xsl:param name="AlertMeText" />
 <xsl:param name="SrchRSSText" />
 <xsl:param name="SrchRSSLink" />
 <xsl:param name="ShowMessage" />
 <xsl:param name="IsThisListScope" />
 <xsl:param name="DisplayDiscoveredDefinition" select="True" />
 <xsl:param name="NoFixedQuery" />
 <xsl:param name="NoKeyword" />
 <xsl:param name="NoResults" />
 <xsl:param name="NoResults1" />
 <xsl:param name="NoResults2" />
 <xsl:param name="NoResults3" />
 <xsl:param name="NoResults4" />
 <xsl:param name="DefinitionIntro" />

 <!-- When there is keywory to issue the search -->
 <xsl:template name="dvt_1.noKeyword">
  <span class="srch-description">
   <xsl:choose>
    <xsl:when test="$IsFixedQuery">
     <xsl:value-of select="$NoFixedQuery" />
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="$NoKeyword" />
    </xsl:otherwise>
   </xsl:choose>
  </span>
 </xsl:template>


 <!-- When empty result set is returned from search -->
 <!—Отображается когда запрос не вернул ответов -->
 <xsl:template name="dvt_1.empty">
  <div class="srch-sort">
   <xsl:if test="$AlertMeLink and $ShowActionLinks">
    <span class="srch-alertme" >
     <a href ="{$AlertMeLink}" id="CSR_AM1" title="{$AlertMeText}">
      <img style="vertical-align: middle;" src="/_layouts/images/bell.gif" alt="" border="0"/>
      <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
      <xsl:value-of select="$AlertMeText" />
     </a>
    </span>
   </xsl:if>

   <xsl:if test="string-length($SrchRSSLink) &gt; 0 and $ShowActionLinks">
    <xsl:if test="$AlertMeLink">
     |
    </xsl:if>
    <a type="application/rss+xml" href ="{$SrchRSSLink}" title="{$SrchRSSText}" id="SRCHRSSL">
     <img style="vertical-align: middle;" border="0" src="/_layouts/images/rss.gif" alt=""/>
     <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
     <xsl:value-of select="$SrchRSSText"/>
    </a>
   </xsl:if>
  </div>
  <br/>
  <br/>

  <span class="srch-description" id="CSR_NO_RESULTS">
   <xsl:value-of select="$NoResults" />

   <ol>
    <li>
     <xsl:value-of select="$NoResults1" />
    </li>
    <li>
     <xsl:value-of select="$NoResults2" />
    </li>
    <li>
     <xsl:value-of select="$NoResults3" />
    </li>
    <li>
     <xsl:value-of select="$NoResults4" />
    </li>
   </ol>
  </span>
 </xsl:template>


 <!-- Main body template. Sets the Results view (Relevance or date) options -->
 <xsl:template name="dvt_1.body">
  <!-- Выборка всех результатов из набора столбцов -->
  <xsl:variable name="Rows" select="/All_Results/Result"/>
  <div class="srch-results">
   <xsl:if test="$ShowActionLinks">
    <div class="srch-sort">
     <xsl:value-of select="$ResultsBy" />
     <xsl:if test="$ViewByUrl">
      |
      <a href ="{$ViewByUrl}" id="CSR_RV" title="{$ViewByValue}">
       <xsl:value-of select="$ViewByValue" />
      </a>
     </xsl:if>
     <xsl:if test="$AlertMeLink">
      |
      <span class="srch-alertme" >
       <a href ="{$AlertMeLink}" id="CSR_AM2" title="{$AlertMeText}">
        <img style="vertical-align: middle;" src="/_layouts/images/bell.gif" alt="" border="0"/>
        <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
        <xsl:value-of select="$AlertMeText" />
       </a>
      </span>
     </xsl:if>
     <xsl:if test="string-length($SrchRSSLink) &gt; 0">
      |
      <a type="application/rss+xml" href ="{$SrchRSSLink}" title="{$SrchRSSText}" id="SRCHRSSL">
       <img style="vertical-align: middle;" border="0" src="/_layouts/images/rss.gif" alt=""/>
       <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
       <xsl:value-of select="$SrchRSSText"/>
      </a>
     </xsl:if>
    </div>
    <br />
    <br />
   </xsl:if>
<!—Шапка таблицы с результатами запроса информации. Обязательно вносите изменения в этом месте и в блоке запросов для каждой строки, шаблон отмечен комментариями "выполняется для каждой строки"   -->
   <table border="0" width="100%" cellpadding="2" cellspacing="0">
    <tr valign="top">
     <th class="ms-vh" nowrap="nowrap">Title</th>
     <th class="ms-vh" nowrap="nowrap">Summary</th>
     <th class="ms-vh" nowrap="nowrap">Last Modified</th>
     <!-- Заголовки для столбца KvnBarCode -->
     <th class="ms-vh" nowrap="nowrap">KvnBarCode</th>
     <!-- Заголовки для столбца KvnDepartment -->
     <th class="ms-vh" nowrap="nowrap">KvnDepartment</th>

    </tr>
    <xsl:call-template name="results">
     <xsl:with-param name="Rows" select="$Rows"/>
    </xsl:call-template>
   </table>
   <xsl:call-template name="DisplayMoreResultsAnchor" />
  </div>
 </xsl:template>
 <xsl:template name="results">
  <xsl:param name="Rows"/>
  <xsl:for-each select="$Rows">
   <xsl:call-template name="Result3"/>
  </xsl:for-each>
 </xsl:template>

 <!-- This template is called for each result -->
 <!-- выполняется для каждой строки -->
 <!— Формирование строки для таблицы результатов -->
<!— при добавлении нового столбца обязательно добавьте в шапку таблицы определение этого столбца -->


 <xsl:template name="Result3">
  <tr>
   <td class="ms-vb">
    <a href="{url}">
     <xsl:value-of select="title" />
    </a>
   </td>
   <td>
    <xsl:value-of select="description" disable-output-escaping="yes"/>
   </td>
   <td class="ms-vb">
    <xsl:value-of select="write" disable-output-escaping="yes"/>
   </td>

   <td class="ms-vb">
    <xsl:value-of select="kvnbarcode" disable-output-escaping="yes"/>
   </td>
   <td class="ms-vb">
    <xsl:value-of select="kvndepartment" disable-output-escaping="yes"/>
   </td>
  </tr>
 </xsl:template>
 <xsl:template name="HitHighlighting">
  <xsl:param name="hh" />
  <xsl:apply-templates select="$hh"/>
 </xsl:template>

 <xsl:template match="ddd">
  &#8230;
 </xsl:template>
 <xsl:template match="c0">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c1">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c2">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c3">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c4">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c5">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c6">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c7">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c8">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c9">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c10">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c11">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c12">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>




 <!-- The size attribute for each result is prepared here -->
 <xsl:template name="DisplaySize">
  <xsl:param name="size" />
  <xsl:if test='string-length($size) &gt; 0'>
   <xsl:if test="number($size) &gt; 0">
    -
    <xsl:choose>
     <xsl:when test="round($size div 1024) &lt; 1">
      <xsl:value-of select="$size" /> Bytes
     </xsl:when>
     <xsl:when test="round($size div (1024 *1024)) &lt; 1">
      <xsl:value-of select="round($size div 1024)" />KB
     </xsl:when>
     <xsl:otherwise>
      <xsl:value-of select="round($size div (1024 * 1024))"/>MB
     </xsl:otherwise>
    </xsl:choose>
   </xsl:if>
  </xsl:if>
 </xsl:template>



 <!-- A generic template to display string with non 0 string length (used for author and lastmodified time -->
 <xsl:template name="DisplayString">
  <xsl:param name="str" />
  <xsl:if test='string-length($str) &gt; 0'>
   -
   <xsl:value-of select="$str" />
  </xsl:if>
 </xsl:template>

 <!-- document collapsing link setup -->
 <xsl:template name="DisplayCollapsingStatusLink">
  <xsl:param name="status"/>
  <xsl:param name="urlEncoded"/>
  <xsl:param name="id"/>
  <xsl:if test="$CollapsingStatusLink">
   <xsl:choose>
    <xsl:when test="$status=1">
     <br/>
     <xsl:variable name="CollapsingStatusHref" select="concat(substring-before($CollapsingStatusLink, '$$COLLAPSE_PARAM$$'), 'duplicates:&quot;', $urlEncoded, '&quot;', substring-after($CollapsingStatusLink, '$$COLLAPSE_PARAM$$'))"/>
     <span class="srch-dup">
      [<a href="{$CollapsingStatusHref}" id="$id" title="{$CollapseDuplicatesText}">
       <xsl:value-of select="$CollapseDuplicatesText"/>
      </a>]
     </span>
    </xsl:when>
   </xsl:choose>
  </xsl:if>
 </xsl:template>
 <!-- The "view more results" for fixed query -->
 <xsl:template name="DisplayMoreResultsAnchor">
  <xsl:if test="$MoreResultsLink">
   <a href="{$MoreResultsLink}" id="CSR_MRL">
    <xsl:value-of select="$MoreResultsText"/>
   </a>
  </xsl:if>
 </xsl:template>

 <xsl:template match="All_Results/DiscoveredDefinitions">
  <xsl:variable name="FoundIn" select="DDFoundIn" />
  <xsl:variable name="DDSearchTerm" select="DDSearchTerm" />
  <xsl:if test="$DisplayDiscoveredDefinition = 'True' and string-length($DDSearchTerm) &gt; 0">
   <script language="javascript">
    function ToggleDefinitionSelection()
    {
    var selection = document.getElementById("definitionSelection");
    if (selection.style.display == "none")
    {
    selection.style.display = "inline";
    }
    else
    {
    selection.style.display = "none";
    }
    }
   </script>
   <div>
    <a href="#" onclick="ToggleDefinitionSelection(); return false;">
     <xsl:value-of select="$DefinitionIntro" />
     <b>
      <xsl:value-of select="$DDSearchTerm"/>
     </b>
    </a>
    <div id="definitionSelection" class="srch-Description" style="display:none;">
     <xsl:for-each select="DDefinitions/DDefinition">
      <br/>
      <xsl:variable name="DDUrl" select="DDUrl" />
      <xsl:value-of select="DDStart"/>
      <b>
       <xsl:value-of select="DDBold"/>
      </b>
      <xsl:value-of select="DDEnd"/>
      <br/>
      <xsl:value-of select="$FoundIn"/>
      <a href="{$DDUrl}">
       <xsl:value-of select="DDTitle"/>
      </a>
     </xsl:for-each>
    </div>
   </div>
  </xsl:if>
 </xsl:template>

 <!-- XSL transformation starts here -->
 <xsl:template match="/">
  <xsl:if test="$AlertMeLink">
   <input type="hidden" name="P_Query" />
   <input type="hidden" name="P_LastNotificationTime" />
  </xsl:if>
  <xsl:choose>
   <xsl:when test="$IsNoKeyword = 'True'" >
    <xsl:call-template name="dvt_1.noKeyword" />
   </xsl:when>
   <xsl:when test="$ShowMessage = 'True'">
    <xsl:call-template name="dvt_1.empty" />
   </xsl:when>
   <xsl:otherwise>
    <xsl:call-template name="dvt_1.body"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

 <!-- End of Stylesheet -->
</xsl:stylesheet>

Заключение

Данное исследование позволит вам изменить атрибуты при поиске документов, и изменить вывод результатов поиска для соответствия потребностям ваших заказчиков. Данная статьтья служит продолжением исследования возможностей изменения внешнего вида MOSS (кастомизации). Комплексное применение материалов приведенных в этих статьях позволяет настроить внешний вид портала и изменить поведение приложения для соответствия нуждам заказчика.


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

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