Как в DSpace XMLUI изменить фрагмент предварительного просмотра для результатов поиска?

Текущее состояние

DSpace XMLUI (темы Mirage, Mirage 2 с фокусом «метаданные») по умолчанию отображает элементы в списках результатов поиска следующим образом:

  1. Когда поисковый запрос был найден в метаданных заголовка/автора/издателя, элемент отображается как в списках «недавно добавленных» (включая первую часть аннотации).
  2. Когда поисковый запрос был найден в аннотации, абстрактный фрагмент, показанный для элемента, «смещается», чтобы показать контекст, в котором был найден поисковый запрос.
  3. Когда поисковый запрос был найден в извлеченном полном тексте, абстрактный фрагмент вообще не отображается. Вместо этого отображается фрагмент извлеченного полного текста, чтобы показать контекст, в котором был найден поисковый запрос.

Во всех трех случаях условия поиска выделены жирным шрифтом.

Проблемы с этим подходом

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

  • Вышеприведенная логика не понятна пользователю; списки результатов поиска могут представлять собой сочетание элементов с показанным началом аннотации, элементов с показанной средней частью аннотации и элементов с показанным полнотекстовым фрагментом.
  • Извлеченный полный текст может содержать «уродливые» специальные символы и, как правило, включает имя файла, размер файла и другие метаданные, мало важные для пользователя.
  • Извлеченный полный текст может быть из ограниченного битового потока, а фрагмент предварительного просмотра может раскрывать информацию, которая предположительно является конфиденциальной (см. эта ошибка DSpace).

Желаемое поведение

Вместо этого я хотел бы всегда показывать абстрактный фрагмент для элементов в списках результатов поиска. Допустимо, чтобы абстрактный фрагмент «смещался», чтобы показать контекст поискового запроса, но это должно быть ясно для пользователя. Когда искомый термин находится только в полнотекстовом файле, должно быть показано начало аннотации вместе с сообщением о том, что полнотекстовый файл, принадлежащий элементу, содержит поисковый термин.


person schweerelos    schedule 15.03.2016    source источник


Ответы (2)


Абстрактная/предварительная часть фрагмента списка результатов поиска создается в файле discovery.xml, например, начиная здесь для текущей версии файла в Mirage 2. Настройка этого оператора "выбрать" следующим образом даст желаемый результат (хотя он не является надежным с точки зрения i18n):

<xsl:choose>
  <xsl:when test="dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item/dri:hi">
    <!-- 
        search term found in abstract - show context 
        around search term location(s) 
    -->
    <div class="abstract">
      <strong>Search term found in abstract:</strong>
      <xsl:for-each select="dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item">
        <xsl:text>… </xsl:text><xsl:apply-templates select="."/><xsl:text> …</xsl:text>
        <br/>
      </xsl:for-each>
    </div>
  </xsl:when>
  <xsl:when test="dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item">
    <!-- 
         search term not found in abstract but the item has an abstract 
         - show first part of abstract like in recently added lists 
    -->
    <div class="abstract">
      <xsl:value-of select="util:shortenString(dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item, 220, 10)"/>                       
    </div>
  </xsl:when>
</xsl:choose>
<xsl:if test="not(dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item/dri:hi) and dri:list[@n=(concat($handle, ':fulltext'))]">
  <!-- 
      search term not found in abstract but found in fulltext file - 
      show message _instead_ of preview; if there is an abstract 
      then it will already be shown via the choose statement above 
  -->
  <strong>(Search term found in fulltext file)</strong>
</xsl:if>
person schweerelos    schedule 15.03.2016
comment
Когда я попытался реализовать функцию util:shortenString, я получил следующую ошибку: org.apache.xpath.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: util - person veeTrain; 28.03.2016
comment
Я исправил это, добавив это в xsl:stylesheet в начале файла: xmlns:util="org.dspace.app.xmlui.utils.XSLUtils" и, возможно, также исключив util в качестве префикса результата. - person veeTrain; 28.03.2016

Спасибо шверелос! По вашему примеру мы внесли следующие изменения в наш discovery.xsl:

Сначала нам нужно было добавить дополнительный элемент в таблицу стилей, чтобы выполнить сокращение строки:

<xsl:stylesheet
    xmlns:util="org.dspace.app.xmlui.utils.XSLUtils"
    ...
    exclude-result-prefixes="xalan encoder i18n dri util ...">

А затем мы изменили ветвь :fulltext, чтобы она отображала первые 220 символов аннотации (если она присутствует).

<xsl:choose>
    <xsl:when test="dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item/dri:hi">
        <div class="abstract">
            <xsl:for-each select="dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item">
                <xsl:apply-templates select="."/>
                <xsl:text>...</xsl:text>
                <br/>
            </xsl:for-each>
        </div>
    </xsl:when>

    <xsl:otherwise> <!-- NEW APPROACH STARTS ON THIS LINE -->
        <div class="abstract">
            <xsl:value-of select="util:shortenString(dri:list[@n=(concat($handle, ':dc.description.abstract'))]/dri:item, 220, 10)"/>
        </div>
    </xsl:otherwise>
</xsl:choose>

Мы обнаружили, что это приемлемый компромисс, который обеспечивает согласованный внешний вид. Вы видите либо выделение попаданий, где поисковый термин был найден (KWIC), либо в dc.description.abstract, указанном в записи, либо в начале dc.description.abstract.

И если сам текст реферата в настоящее время находится под эмбарго (или ограничен на неопределенный срок), то любой поисковый запрос, который в противном случае показывал бы ограниченный контент в старой презентации, просто отображает «реферат этого элемента ограничен...», поскольку поле dc.description.abstract заполнено этим текстом. .

Приведенный выше подход (часть <xsl:otherwise>) заменил следующий контент.

ОТКЛОНЕННЫЙ (как доставлено) ПОДХОД:

<xsl:when test="dri:list[@n=(concat($handle, ':fulltext'))]">
    <div class="abstract">
        <xsl:for-each select="dri:list[@n=(concat($handle, ':fulltext'))]/dri:item">
        <xsl:apply-templates select="."/>
        <xsl:text>...</xsl:text>
        <br/>
        </xsl:for-each>
    </div>
</xsl:when>

Файл находился в неожиданном месте, и если бы я понял больше о том, как работал процесс разработки, я, вероятно, мог бы поместить его в папку тем НАШИ, но в его нынешнем виде он был отредактирован в теме dri2xhtml-alt. Я не ожидал, что файл, который влияет на это поведение, будет найден там, но кажется совершенно очевидным, что он работает, чтобы изменить его там.

\DSpaceRepo\dspace-xmlui\src\main\webapp\themes\dri2xhtml-alt\aspect\artifactbrowser\discovery.xsl

И последнее, что вы должны знать: если вы редактируете этот файл и ожидаете, что изменения будут очевидны для вас, вам нужно продолжать очищать историю/кэш браузера или выполнять новые поиски. По этой причине процесс редактирования был немного трудным (похоже, не отражал последние изменения), пока я не придумал хороший рабочий процесс.

person veeTrain    schedule 07.04.2016