SharePoint: relative Pfade in XSLT verwenden

Wenn man eine SharePoint-Listenansicht mittels XSLT anpasst, so möchte man häufig auch relative Pfade verwenden.

Besonders wichtig, wenn man eine XSL-Datei für ein Feature deployed, welches in verschiedenen Webs aufgerufen wird und folglich keine absoluten Pfade sondern relative enthalten sollte.

Dies lässt sich innerhalb einer SharePoint-Seite mit der Verwendung des globalen XSLT-Parameters „ServerRelativeUrl“ einfach lösen, wie nachfolgendes Beispiel (Auszug aus einer XSL-Datei) zeigt:

                  <a href="{$ServerRelativeUrl}/Lists/Customers/DispForm.aspx?ID={@ID}">
                    <xsl:value-of select="@Title"/>
                  </a>

Man hätte natürlich auch z.B. „../Lists“ oder „http://servername/…“ voranstellen können, jedoch verliert man dann Flexibilität. Sobald der Servername geändert wird (man denke auch an „Alternate Access Mappings“ und Extranet-Lösungen)  oder das XSL auf einer Listen-Ansicht statt auf einer Page verwendet wird, geht der Link nicht mehr, da der Verweis dann einen ungültigen Pfad hat.

Damit der globale Parameter verfügbar ist, muss innerhalb der XSL-Datei die „Main.xsl“-Datei von SharePoint referenziert werden:

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal">
  <xsl:import href="/_layouts/xsl/main.xsl"/>
  ...

Informationen über verfügbare globale Parameter findet ihr hier: http://msdn.microsoft.com/en-us/library/ff806158.aspx

SharePoint: Elemente ohne Ordner in einem DataView-WebPart anzeigen

Wenn man im SharePoint-Designer eine ganz normale View, welche ein XslListView-WebPart enthält bearbeitet, so kann man via Ribbon einstellen wie mit Ordnern umgegangen werden soll. Entweder es wird nur der Inhalt eines spezifischen Ordners angezeigt, es werden alle Elemente aller Ordner angezeigt oder es werden alle Elemente und alle Ordner (mit Unterordner) angezeigt.

Verwendet man auf der View jedoch ein DataView-WebPart (zum Beispiel weil, man nach mehr als zwei Elementen gruppieren möchte), so sind diese Optionen zwar auch im Ribbon verfügbar, doch scheinen sie keine Auswirkungen mehr zu haben (Bug?).

Die gewünsche Einstellung lässt sich aber zum Glück auch ohne (zumindest fast ohne) Klicki-Bunti von Hand erledigen:

  1. Dazu öffnet man (im SharePoint Designer) am einfachsten die View in der Split-Ansicht oder Code ansicht, so dass man den Quellcode der Seite bearbeiten kann.
  2. Nun sucht man nach dem Tag „SharePoint:SPDataSource“ innerhalb des DataForm-/DataView-WebParts und klickt diesen an.
  3. Nun sollte das „Tag Properties“-Window erscheinen (falls nicht, muss dieses zuerst via Kontextmenü geöffnet werden)
  4. Unter „Tag Properties“ gibt es nun einen Eintrag „Scope“ und der Wert dafür kann man bequem mittels Dropdownmenü selektieren, z.B. „Recursive“ (alle Elemente) oder „RecursiveAll“ (alle Elemente und alle Ordner).
  5. Zum Schluss natürlich die Seite noch abspeichern und wenn nötig Publishen, damit die Änderung für einem selber und Benutzer sichtbar wird

Mehr details zu „Scope“ findet ihr in der MSDN zum SPViewScope-Eintrag.