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