Share via


Gewusst wie: Anpassen des Renderings eines Felds in einer Listenansicht

Letzte Änderung: Dienstag, 29. März 2011

Gilt für: SharePoint Foundation 2010

Inhalt dieses Artikels
Übersicht über das Rendering eines benutzerdefinierten Felds in Listenansichten
Definieren von benutzerdefiniertem Rendering für ein benutzerdefiniertes Feld
Beispiel: Anpassen eines Währungsfelds

In diesem Thema wird erläutert, wie Sie das Rendering eines benutzerdefinierten Felds in Listenansichten definieren können.

Übersicht über das Rendering eines benutzerdefinierten Felds in Listenansichten

In Microsoft SharePoint Foundation werden XSLT-Stylesheets zum Rendern von Listenansichten verwendet. (Eine Erläuterung des Systems finden Sie unter Übersicht über das XSLT-System des Rendering von Listenansichten.) Eine Liste wird als HTML-Tabelle gerendert, wobei der Wert eines Felds durch eine einfache XSLT-Vorlage aus der Datei fldtypes.xsl in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL in die entsprechende Zelle der Tabelle gerendert wird. Diese Datei enthält zahlreiche Vorlagen zum Rendern eines Feldwerts. Welche Vorlage verwendet wird, hängt von mehreren Faktoren ab. Der wichtigste ist der Typ des Felds gemäß seiner Definition in der SPFieldType-Enumeration. Beispielsweise gibt es eine FieldRef_Number_body-Vorlage für Number-Felder und eine FieldRef_Text_body-Vorlage für Text-Felder.

HinweisHinweis

Es besteht keine 1:1-Entsprechung zwischen Feldtypen und Vorlagen. Beispielsweise gibt es mehrere verschiedene Vorlagen für berechnete Felder, und die FieldRef_Number_body-Vorlage wird für Currrency()-Felder ebenso wie für Number-Felder verwendet.

Das folgende Beispiel zeigt die FieldRef_Text_body-Vorlage.

<xsl:template name="FieldRef_Text_body" ddwrt:dvt_mode="body" match ="FieldRef" mode="Text_body">
  <xsl:param name="thisNode" select="."/>
  <xsl:choose>
    <xsl:when test="@AutoHyperLink='TRUE'">
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping ="yes"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Der thisNode-Parameter, der an diese Vorlage übergeben wird, besteht aus dsQueryResponse-Markup, das die Elemente der Liste enthält (bis zur maximal zulässigen Anzahl pro Seite). Ein Beispiel für dieses Markup finden Sie unter Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen.

Die Vorlage enthält eine Verzweigung, abhängig davon, ob das Feld für die automatische Formatierung von URL-ähnlichen Zeichenfolgen als HTML-Links <a> definiert ist. Ist dies der Fall, werden beim Rendern des HTML-Codes für das Feld durch den XSLT-Prozessor signifikante Zeichen wie "<" und "&" nicht durch die äquivalenten Zeichenentitäten (&lt; und &amp;) ersetzt, wie dies in einem kompatiblen XSLT-Prozessor standardmäßig üblich wäre. Außer dieser Verzweigung wird in der Vorlage mit der folgenden Zeile der Feldwert ausgegeben.

<xsl:value-of select="$thisNode/@*[name()=current()/@Name]"/>

Da diese Zeile in nahezu allen XSLT-Feldrenderingvorlagen enthalten ist, verdient sie eine genauere Betrachtung. Der erste Schritt des XPath-Ausdrucks, der den Knoten mit dem zu rendernden Wert identifiziert, ist einfach ein Verweis auf den thisNode-Parameter. Somit werden die verbleibenden Schritte relativ zum Stamm des Markups in diesem Parameter interpretiert. Der nächste Schritt vor der Anwendung von Prädikaten ist /@*. Dies verweist auf alle Attribute des Stamms und seiner untergeordneten Elemente, in diesem Fall also auf alle Attribute aller Elemente in thisNode. Das Prädikat [name()=current()/@Name] engt die Auswahl weiter ein. Auf der linken Seite von "=" steht die XSLT-Funktion name(). Sie stellt den Namen eines Knotens in der vom "$thisNode/@*"-Teil erzeugten Sequenz dar. Mit anderen Worten, sie stellt den Namen eines Attributs in einem Element von thisNode dar. Wenn Sie dies auf das Beispiel thisNode aus Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen anwenden, sehen Sie, dass einige Attribute darin nach den internen Namen von Feldern des Listenelements benannt sind. Zum Beispiel Attachments, Title und das benutzerdefinierte Feld ISBN. Die rechte Seite von "=" besteht aus einem Verweis auf das Name-Attribut des aktuellen Knotens in der Quellstruktur: current()/@Name. Da diese Vorlage mit match ="FieldRef" deklariert ist, wird sie nur auf FieldRef-Elemente angewendet. Daher verweist die current()-Funktion auf ein FieldlRef-Element. Somit bedeutet das gesamte xsl:value-of-Element: "gib den Wert des Attributs von thisNode aus, dessen Name dem Namen des aktuellen FieldRef-Elements in der Quellstruktur entspricht".

Bei der Verarbeitung des FieldRef-Elements mit dem Namen Title in der Beispielquellstruktur wird somit vom XSLT-Prozessor dafür der Wert des Title-Attributs des aktuellen Row-Elements im thisNode-Markup ausgegeben. (Für die erste Zeile wäre dies "Theories of Truth"). Entsprechend wird der Wert des ISBN-Attributs desselben Row-Elements gerendert, wenn das FieldRef-Element mit den Namen ISBN aus der Quellstruktur ("0-262-61107-4") verarbeitet wird.

In den meisten Fällen entspricht das Standardrendering des benutzerdefinierten Felds, das im Wesentlichen durch seinen Basistyp bestimmt wird, dem gewünschten Rendering. Im Falle des Textfelds wird der Wert beispielsweise als Nur-Text in der entsprechenden Zelle der HTML-Tabelle gerendert. Soll ein benutzerdefiniertes Feld auf besondere Art gerendert werden, müssen Sie das Rendering in einem XSLT-Stylesheet definieren. Dies wird im nächsten Abschnitt beschrieben.

Definieren von benutzerdefiniertem Rendering für ein benutzerdefiniertes Feld

Im folgenden Verfahren wird das Erstellen eines benutzerdefinierten XSLT-Stylesheets zum Rendern eines benutzerdefinierten Feldtyps beschrieben.

So erstellen Sie ein benutzerdefiniertes XSLT-Stylesheet für das Feldrendering

  1. Erstellen Sie eine Textdatei mit der Erweiterung "xsl". Sie muss nach dem Muster fldtypes_*.xsl benannt werden, wobei "*" für eine beliebige Zeichenfolge zulässiger Dateinamenzeichen steht. Sie können beispielsweise den Namen des benutzerdefinierten Felds verwenden, wie in fldtypes_ISBN.xsl. Wenn Sie über mehrere benutzerdefinierte XSLT-Stylesheets verfügen, könnten Sie auch den Firmennamen verwenden, wie in fldtypes_Contoso.xsl, und alle Stylesheets in dieselbe Datei einschließen. Vermeiden Sie Zeichenfolgen, die möglicherweise von einem anderen Lösungsanbieter verwendet werden.

  2. Fügen Sie der Datei die folgende Stylesheetdeklaration hinzu.

    <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
                    xmlns:d="https://schemas.microsoft.com/sharepoint/dsp"
                    version="1.0"
                    exclude-result-prefixes="xsl msxsl ddwrt"
                    xmlns:ddwrt="https://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                    xmlns:asp="https://schemas.microsoft.com/ASPNET/20"
                    xmlns:__designer="https://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:stylesheet>
    
  3. Öffnen Sie die Datei fldtypes.xsl in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL, und suchen Sie die Vorlage, durch die das Feld standardmäßig gerendert wird. Ist der Basistyp des Felds beispielsweise Currency, lautet die Vorlage FieldRef_Number_body. Kopieren Sie die Vorlage als untergeordnetes Element Ihres xsl:stylesheet-Elements. Nachstehend sehen Sie ein Beispiel für die Verwendung der FieldRef_Number_body-Vorlage.

    <xsl:stylesheet > <!-- stylesheet attributes omitted for brevity -->
    
      <xsl:template name="FieldRef_Number_body" ddwrt:dvt_mode="body" match="FieldRef" mode="Number_body">
        <xsl:param name="thisNode" select="."/>
        <xsl:choose>
          <xsl:when test="$FreeForm">
            <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
              <xsl:with-param name="thisNode" select="$thisNode"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <div align="right">
              <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
                <xsl:with-param name="thisNode" select="$thisNode"/>
              </xsl:call-template>
            </div>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>
    
    </xsl:stylesheet>
    
  4. Löschen Sie das name-Attribut aus dem xsl:template-Element (in diesem Fall name="FieldRef_Number_body"). Löschen Sie ggf. auch das ddwrt:dvt_mode-Attribut.

  5. Ändern Sie das match-Attribut so, dass die Vorlage nur auf Felder mit dem genauen internen Namen des benutzerdefinierten Felds angewendet wird. Geben Sie dazu in einem XSLT-Prädikat den erforderlichen Wert des Name-Attributs des FieldRef-Elements an. Angenommen, Sie verwenden ein Feld Net Profit/Loss mit dem internen Namen "Net_x0020_Profit_x002f_Loss", dann sieht das Starttag der Vorlage folgendermaßen aus.

    <xsl:template match="FieldRef[@Name='Net_x0020_Profit_x002f_Loss']" mode="Number_body">
    

    Dadurch wird sichergestellt, dass Sie nur das Rendering des benutzerdefinierten Feldtyps anpassen, nicht aller Felder mit dem Basistyp Currency oder Number.

  6. Bearbeiten und erweitern Sie das Markup der Vorlage, um den gewünschten Renderingeffekt zu erzielen. Ein Beispiel finden Sie im folgenden Abschnitt.

  7. Speichern und kopieren Sie die Datei fldtypes_*.xsl in das Verzeichnis %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL auf allen Servern.

  8. Setzen Sie die Webanwendung zurück, damit die Dateien in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL erneut geladen werden. Integrierte Dateien werden durch die benutzerdefinierte Datei überschrieben.

Beispiel: Anpassen eines Währungsfelds

Als detailliertes Beispiel für Schritt 6 wird in diesem Abschnitt gezeigt, wie der Wert des Net Profit/Loss-Felds rot gerendert wird, wenn es sich um eine negative Zahl handelt. Nach Schritt 5 sollte die Vorlage folgendermaßen aussehen.

<xsl:stylesheet > <!-- stylesheet attributes omitted for brevity -->

  <xsl:template match="FieldRef[@Name='Net_x0020_Profit_x002f_Loss']" mode="Number_body">
    <xsl:param name="thisNode" select="."/>
    <xsl:choose>
      <xsl:when test="$FreeForm">
        <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
          <xsl:with-param name="thisNode" select="$thisNode"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <div align="right">
          <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
            <xsl:with-param name="thisNode" select="$thisNode"/>
          </xsl:call-template>
        </div>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

Beachten Sie zunächst, dass das Standardrendering in Abhängigkeit vom Test des FreeForm-Parameters verzweigt. Dieser Test gibt true zurück, wenn das Type-Attribut des Toolbar-Elements in der Quellstruktur "FreeForm" lautet. Hat das Attribut den Wert "Standard" oder ist das Attribut nicht vorhanden, wird von der Vorlage HTML-Markup hinzugefügt, um den Feldwert rechtsbündig in der entsprechenden Zelle darzustellen. (Unter Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen finden Sie ein Beispiel für eine Quellstruktur und das zugehörige Toolbar-Element. Weitere Informationen finden Sie unter Toolbar Element (View).) Da negative Werte ungeachtet des Typs der Symbolleiste rot dargestellt werden sollen, müssen die Markupänderungen in beiden Zweigen ausgeführt werden.

Beachten Sie auch, dass in der Vorlage eine weitere Vorlage namens FieldRef_ValueOf_DisableEscape aufgerufen wird, um den Wert tatsächlich zu rendern. Diese Vorlage befindet sich ebenfalls in fldtypes.xsl und ist folgendermaßen definiert.

<xsl:template name="FieldRef_ValueOf_DisableEscape" ddwrt:dvt_mode="body">
  <xsl:param name="thisNode" select="."/>
  <xsl:value-of disable-output-escaping="yes" select="$thisNode/@*[name()=current()/@Name]" />
</xsl:template>

Diese Vorlage unterscheidet sich von der standardmäßigen Feldrenderingvorlage, in der der Feldwert mit der Zeile <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" /> gerendert wird, nur durch das zusätzliche Attribut disable-output-escaping="yes", das weiter oben in diesem Thema erläutert wurde.

Fügen Sie im <xsl:when test="$FreeForm">-Element eine choose-when-otherwise-Struktur hinzu, und verschieben Sie den vorhandenen Aufruf der FieldRef_ValueOf_DisableEscape-Vorlage in das <xsl:otherwise>-Element, wie im folgenden Beispiel dargestellt.

<xsl:when test="$FreeForm">
  <xsl:choose> 
    <when test=""> 

    </when> 
    <otherwise>
        <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
          <xsl:with-param name="thisNode" select="$thisNode"/>
        </xsl:call-template>
    </otherwise> 
  </choose>
</xsl:when>

Der test-Wert sollte true sein, wenn der Wert des aktuellen Net_x0020_Profit_x002f_Loss-Felds negativ, d. h. kleiner Null ist. Sie haben bereits gesehen, dass $thisNode/@*[name()=current()/@Name] zum aktuellen Feld ausgewertet wird. Währungsfelder erhalten jedoch in SharePoint Foundation eine einfache Formatierung, bevor irgendeine XSLT-Formatierung angewendet wird. Insbesondere wird ein negativer Währungswert durch Klammern statt durch ein Minuszeichen dargestellt. Beispielsweise wird ein Verlust von $497.882,87 durch ($497.882,87) statt durch -$497.882,87 dargestellt. Dies ist problematisch, da Ausdrücke in Klammern vom XSLT-Prozessor als Werte größer Null behandelt werden. Somit kann der Wert von $thisNode/@*[name()=current()/@Name] nicht direkt mit Null verglichen werden. Glücklicherweise wird dem Markup für Währungsfeldtypen im thisNode-Parameter von SharePoint Foundation eine zweite Version des Feldwerts vom Typ Double hinzugefügt, dessen negative Werte mit einem Minuszeichen ausgedrückt werden. Diese Version ist der Wert eines Attributs des Row-Elements, das denselben Namen hat wie das Net_x0020_Profit_x002f_Loss-Attribut, jedoch mit einem Punkt (".") am Ende. Vergleichen Sie z. B. die Attribute "Retail_x0020_Price" und "Retail_x0020_Price." des Row-Elements im Beispiel von "thisNode" in Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen.

Verwenden Sie dieses Attribut mit dem Punkt am Namensende, um auf einen negativen Wert zu testen. Der test-Ausdruck sollte folgendermaßen lauten.

<xsl:when test="$thisNode/@*[name()=concat(current()/@Name, '.')] &lt; 0">
TippTipp

"&lt;" muss anstelle von "<" verwendet werden, da Letzteres vom XSLT-Prozessor als Anfang eines Elements interpretiert würde. Wenn Sie möchten, können Sie die Operanden vertauschen, sodass Sie ein einfaches ">"-Zeichen verwenden können: "0 > $thisNode/@*[name()=concat(current()/@Name, '.')]".

Kopieren Sie nun in der inneren when-Struktur den Aufruf der FieldRef_ValueOf_DisableEscape-Vorlage, aber schließen Sie ihn in HTML-Literale ein, durch die der Wert rot eingefärbt wird. Die äußere when-Struktur sollte nun wie folgt aussehen.

<xsl:when test="$FreeForm">
  <xsl:choose> 
    <xsl:when test="$thisNode/@*[name()=concat(current()/@Name, '.')] &lt; 0"> 
      <span style="color:red">
        <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
          <xsl:with-param name="thisNode" select="$thisNode"/>
        </xsl:call-template>
      </span>
    </xsl:when> 
    <xsl:otherwise>
      <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
        <xsl:with-param name="thisNode" select="$thisNode"/>
      </xsl:call-template>
    </xsl:otherwise> 
  </xsl:choose>
</xsl:when>

Wie weiter oben erwähnt, sollte das Feld unabhängig vom Typ der Symbolleiste in der gleichen Farbe gerendert werden. Die gesamte innere choose-Struktur sollte somit zum Inhalt des div-Elements im otherwise-Teil der äußeren choose-Struktur werden. Dies führt zu folgender Vorlagendefinition.

<xsl:template match="FieldRef[@Name='Net_x0020_Profit_x002f_Loss']" mode="Number_body">
    <xsl:param name="thisNode" select="."/>

  <xsl:choose>
    <xsl:when test="$FreeForm">
      <xsl:choose> 
        <xsl:when test="$thisNode/@*[name()=concat(current()/@Name, '.')] &lt; 0"> 
          <span style="color:red">
            <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
              <xsl:with-param name="thisNode" select="$thisNode"/>
          </xsl:call-template>
          </span>
        </xsl:when> 
        <xsl:otherwise>
          <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
            <xsl:with-param name="thisNode" select="$thisNode"/>
          </xsl:call-template>
        </xsl:otherwise> 
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>    
      <div align="right">
        <xsl:choose> 
          <xsl:when test="$thisNode/@*[name()=concat(current()/@Name, '.')] &lt; 0"> 
            <span style="color:red">
              <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
                <xsl:with-param name="thisNode" select="$thisNode"/>
            </xsl:call-template>
            </span>
          </xsl:when> 
          <xsl:otherwise>
            <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
              <xsl:with-param name="thisNode" select="$thisNode"/>
            </xsl:call-template>
          </xsl:otherwise> 
        </xsl:choose>
      </div>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template

Dies wird leichter handhabbar, wenn die wiederholten Teile mithilfe von XSLT-Variablen und Parametern gekapselt und Vorlagen geschachtelt werden. In der folgenden Version des Stylesheets werden diese Techniken verwendet.

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
                xmlns:d="https://schemas.microsoft.com/sharepoint/dsp"
                version="1.0"
                exclude-result-prefixes="xsl msxsl ddwrt"
                xmlns:ddwrt="https://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                xmlns:asp="https://schemas.microsoft.com/ASPNET/20"
                xmlns:__designer="https://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:template match="FieldRef[@Name='Net_x0020_Profit_x002f_Loss']" mode="Number_body">
    <xsl:param name="thisNode" select="."/>
    
    <xsl:variable name="FieldValue">   
      <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
        <xsl:with-param name="thisNode" select="$thisNode" />
      </xsl:call-template>
    </xsl:variable>
           
    <xsl:variable name="ValueIsNegative">
      <xsl:value-of select="$thisNode/@*[name()=concat(current()/@Name, '.')]  &lt; 0" />
    </xsl:variable>
    
    <xsl:choose>
      <xsl:when test="$FreeForm">
        <xsl:call-template name="RedWhenNegative_ElseBlack" >  
             <xsl:with-param name="thisNode" select="$thisNode" />
             <xsl:with-param name="ValueIsNegative" select="$ValueIsNegative" />
               <xsl:with-param name="FieldValue" select="$FieldValue" />
          </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>    
        <div align="right">
          <xsl:call-template name="RedWhenNegative_ElseBlack" >  
        <xsl:with-param name="thisNode" select="$thisNode" />
        <xsl:with-param name="ValueIsNegative" select="$ValueIsNegative" />
        <xsl:with-param name="FieldValue" select="$FieldValue" />
              </xsl:call-template>
        </div>
      </xsl:otherwise>
    </xsl:choose>
    
  </xsl:template>
  
  <xsl:template name="FieldValueInRed">
    <xsl:param name="thisNode" select="." />
    <xsl:param name="FieldValue" select="." />
    
    <span style="color:red">
      <xsl:value-of select="$FieldValue" />
    </span>
    
  </xsl:template>
  
  <xsl:template name="RedWhenNegative_ElseBlack">
    <xsl:param name="thisNode" select="." />
    <xsl:param name="ValueIsNegative" select="." />
    <xsl:param name="FieldValue" select="." />
    
    <xsl:choose> 
      <xsl:when test="$ValueIsNegative='true'">
          <xsl:call-template name="FieldValueInRed">
            <xsl:with-param name="thisNode" select="$thisNode" />
                <xsl:with-param name="FieldValue" select="$FieldValue" />
          </xsl:call-template>      
      </xsl:when> 
      <xsl:otherwise>
        <xsl:value-of select="$FieldValue" />
      </xsl:otherwise> 
    </xsl:choose>

  </xsl:template>
  
</xsl:stylesheet>

Abbildung 1 zeigt die Darstellung des Felds in einer Liste.

Abbildung 1: Währungsfeld mit roten negativen Werten

Währungsspalte mit negativem Wert (rot dargestellt)

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Feldtyps

Konzepte

Benutzerdefinierte Feldtypen