Aus der Praxis–Link zu Dokumenten auf der Suchseite als Breadcrumb darstellen
avatar

In einem meiner letzten Projekte wollte der Kunde die Suchergebnisseite für sich übersichtlicher gestalten. Neben einigen CSS-Anpassungen. Eine Idee war dabei, dass der Link der unter dem Suchergebnis eines Dokuments zu finden ist verändert wird und als Breadcrumb dargestellt wird.

image

Um die Lösung minimalinvasiv zu gestalten, wollten ich das XSL des SearchCoreResults-WebParts anpassen.

Dabei habe ich zunächst ein andere XSL-Template an der Stelle aufgerufen an dem der Link erzeugt wird.

<xsl:when test="hithighlightedproperties/HHUrl[. != '']">

<xsl:call-template name="LinkBreadCrumb"> <xsl:with-param name="hh" select="hithighlightedproperties/HHUrl"/> </xsl:call-template> </xsl:when>

Die Erstellung des Templates (bzw. der Breadcrumb) habe ich Teilschritte unterteilt.

  <xsl:template name="LinkBreadCrumb">
    <xsl:param name="hh"/>
    <xsl:call-template name="UrlLinks">
      <xsl:with-param name="url" select="$hh" />
    </xsl:call-template>
  </xsl:template>

Ein rekursiver Algorithmus durchsucht die als Input verwendetet Url immer bis zum nächsten Slash (bzw. zum nächste :// für den Anfang der Url). Der Parameter portionSoFar wird für die Ausgabe der Breadcrumb verwandt. Der Parameter remainder wird für den nächsten rekursiven Durchlauf benötigt.

  <xsl:template name="UrlLinks">
    <xsl:param name="url" />
    <xsl:call-template name="UrlLinksIter">
      <xsl:with-param name="portionSoFar" select="concat(substring-before($url, '://'), '://')" />
      <xsl:with-param name="remainder" select="concat(substring-after($url, '://'), '/')" />
    </xsl:call-template>
  </xsl:template>

<xsl:template name="UrlLinksIter"> <xsl:param name="portionSoFar" /> <xsl:param name="remainder" /> <xsl:variable name="nextPart" select="substring-before($remainder, '/')" /> <xsl:variable name="nextRemainder" select="substring-after($remainder, '/')" /> <xsl:if test="normalize-space($nextRemainder) or normalize-space($nextPart)"> <xsl:variable name="url" select="concat($portionSoFar, $nextPart)"/> <xsl:if test="normalize-space($nextPart)"> <!-- $nextPart could be empty if there are multiple slashes in a row--> >> <a href="{$url}"> <xsl:call-template name="lastIndexOf"> <xsl:with-param name="string" select="$url" /> <xsl:with-param name="delimiter" select="'/'" /> </xsl:call-template> </a> </xsl:if> <xsl:call-template name="UrlLinksIter"> <xsl:with-param name="portionSoFar" select="concat($url, '/')" /> <xsl:with-param name="remainder" select="$nextRemainder" /> </xsl:call-template> </xsl:if> </xsl:template>

Das Templater lastIndexOf sucht immer das letzte Wort heraus um die Anzeige für den Link zu liefern.

<xsl:template name="lastIndexOf">
        <!-- declare that it takes two parameters - the string and the char -->
        <xsl:param name="string" />
        <xsl:param name="delimiter" />
        <xsl:choose>
             <!-- if the string contains the character... -->
             <xsl:when test="contains($string, $delimiter)">
                  <!-- call the template recursively... -->
                  <xsl:call-template name="lastIndexOf">
                       <!-- with the string being the string after the character-->
                       <xsl:with-param name="string" select="substring-after($string, $delimiter)" />
                         <!-- and the character being the same as before -->
                         <xsl:with-param name="delimiter" select="$delimiter" />
            
          </xsl:call-template>
      </xsl:when>
             <!-- otherwise, return the value of the string -->
             <xsl:otherwise>
        <xsl:value-of select="$string" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Anschließend fügt man dies in das bestehende Xsl des Search Core Results-WebPart ein und erhält folgende Ansicht mit klickbarer Breadcrumb.

image

Bei der Erstellung des Xsls haben mir viele verschiedene Quellen zum Thema XSL geholfen. Hervorheben möchte ich dabei Stackoverflow, bei deren Community man doch recht schnell qualitativ hochwertige Antworten auf Fragen erhält.

2 Gedanken zu “Aus der Praxis–Link zu Dokumenten auf der Suchseite als Breadcrumb darstellen
avatar

  1. Coole Idee! Aber könnte man nicht direkt das Template „UrlLinks“ aufrufen? Welchen Mehrwert bringt das „LinkBreadCrumb“ Template, das ruft doch nur UrlLinks auf und leitet den Parameter 1:1 weiter, oder?

Schreibe einen Kommentar