Freigeben über


Übersicht über das XSLT-System des Rendering von Listenansichten

Letzte Änderung: Mittwoch, 2. Februar 2011

Gilt für: SharePoint Foundation 2010

Dieses Thema enthält eine Übersicht über das System des Rendering von Listenansichten in Microsoft SharePoint Foundation. Bevor Sie dieses Thema lesen, sollten Ihnen XSLT-Konzepte einschließlich Stylesheets, Vorlagen, Parameter, Knotenstrukturen und Kontextknoten grundsätzlich vertraut sein.

XSLT-Stylesheetrendering

Die im Lieferumfang von SharePoint Foundation enthaltenen XSLT-Stylesheets befinden sich in XSL-Dateien in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL. Die beiden wichtigsten Dateien sind vwsytles.xsl und fldtypes.xsl. Die erste dieser Dateien stellt Stylesheets zum Rendern von Listen bis hinunter auf Zeilenebene bereit. Die zweite Datei stellt Stylesheets zum Rendern bestimmter Felder, d. h. Zellen, in den Listenansichten bereit. Eine große Gruppe von globalen XSLT-Variablen ist in main.xsl definiert.

Ein XSLT-Stylesheet analysiert eine Quellknotenstruktur in einer XML-Sprache und erstellt eine Ergebnisknotenstruktur in einer anderen XML-Sprache. Im einfachsten Fall wird die Quellstruktur in die Ergebnisstruktur umgewandelt. Dies geschieht durch XSLT-Vorlagen, wobei jede dieser Vorlagen eine Art Regel ist, die bestimmt, wie ein bestimmtes Fragment des Quellmarkups in ein Fragment des Ergebnisses umgewandelt wird. Es ist jedoch nicht nötig, dass bei der Transformation einfach ausschließlich sämtliche Informationen der Quellknotenstruktur in der Ergebnissprache neu ausgedrückt werden. Bei einer Transformation können Informationen der Quellstruktur ausgelassen werden, und es können Informationen in das Ergebnis eingefügt werden, die nicht aus der Quelle stammen. Eine XSLT-Vorlage kann insbesondere Informationen aus mehreren Eingabeknotenstrukturen kombinieren. Jede weitere Eingabeknotenstruktur neben der Quellknotenstruktur wird an eine Vorlage als Parameter übergeben. Die XSLT-Vorlagen zum Rendern von Listenansichten von SharePoint Foundation besitzen zwei Eingabeknotenstrukturen:

  • Die Quellknotenstruktur ist das View-Schema-Markup, das die aktuelle Ansicht der Liste definiert. Diese Struktur wird vom XSLT-Prozessor analysiert und durchlaufen, während die Ergebnisstruktur erstellt wird. Daher handelt es sich zu einer bestimmten Zeit während der XSLT-Transformation bei dem Kontextknoten des XSLT-Prozessors um einen Knoten in diesem Markup.

  • Die thisNode-Parameterstruktur wird an jede XSLT-Feldrenderingvorlage durch die aufrufende Vorlage übergeben. Dieses Markup enthält die tatsächlichen Daten aus der Liste. Wenn ein Feld gerendert wird, wird der tatsächliche Feldwert aus diesem Parameter abgerufen. Die vollständige Referenz des Markups im thisNode-Parameter finden Sie unter dsQueryResponse-XML.

Beispiele für diese Knotenstrukturen finden Sie unter Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen.

Hierarchie der XSLT-Vorlagen

Die Hierarchie der XSLT-Vorlagen in SharePoint Foundation ist relativ komplex. Die Kette von Aufrufen der Vorlagen (über xsl:apply-templates und xsl:call-template) beim Rendern der Listenansicht variiert abhängig von zahlreichen Faktoren: u. a. dem Typ der Liste, welche Ansicht der Liste ausgewählt wurde, dem Ansichtsformat und ob die Ansicht Gruppierungen von Zeilen enthält usw. In diesem Abschnitt wird die einfachste mögliche Kette von Aufrufen in dem einfachen Fall beschrieben, dass der Benutzer zu einer Seite mit einer Liste gewechselt hat, die die folgenden Merkmale aufweist.

  • Die Liste ist vom Typ 100 (generisch).

  • Der BaseViewID-Wert der Liste ist 1.

  • Die Ansicht besitzt das Ansichtsformat 0 (Standardtabelle).

  • Zeilen sind nicht gruppiert.

Das System der XSLT-Stylesheets wird vom PreRender-Ereignis der Seite aufgerufen. Die XSLT-Vorlage auf oberster Ebene ist die in vwsytles.xsl deklarierte unbenannte Vorlage mit dem folgenden Starttag.

<xsl:template match="/">

Das Verhalten dieser Vorlage hängt vom Ausgang einiger Boolean Tests ab. Im einfachsten Fall wird jedoch xsl:apply-templates für Vorlagen im RootTemplate-Modus aufgerufen und der aktuelle Kontextknoten ausgewählt, der der Stamm der Quellknotenstruktur ist. (Die XmlDefinition-Variable ist in main.xsl als "." definiert, dem aktuellen Kontextknoten.)

<xsl:apply-templates mode="RootTemplate" select="$XmlDefinition"/>

Dadurch wird die View_Default_RootTemplate-Vorlage auf das View-Element angewendet, bei dem es sich um das Dokumentelement handelt. Dies ist also das oberste Element der Quellknotenstruktur. (Ein Beispiel finden Sie unter Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen.) Es folgt das Starttag für diese Vorlage.

<xsl:template name="View_Default_RootTemplate" mode="RootTemplate" match="View" ddwrt:dvt_mode="root">

Mit dieser Vorlage wird das <table>-HTML-Element konstruiert, das die Liste rendert. Nachfolgende Vorlagen werden mit den folgenden Zeilen aufgerufen.

<xsl:apply-templates select="." mode="full">
  <!-- child node omitted --> 
</xsl:apply-templates>

Mit diesen Zeilen wird xsl:applytemplates für Vorlagen im Vollmodus aufgerufen, und der aktuelle Kontextknoten wird ausgewählt, bei dem es sich zu diesem Zeitpunkt immer noch um das View-Element handelt. In diesem Beispielszenario einer Standardansicht einer generischen Liste stimmt als einzige Vorlage die erste Vorlage im Abschnitt Ansichtsvorlagen von vwsytles.xsl überein. Sie besitzt das folgende Starttag.

<xsl:template match="View" mode="full">

Diese Vorlage beginnt mit dem Rendering einiger HTML-Details der Liste. Am wichtigsten ist hierbei, dass weitere Vorlagen mit der folgenden Zeile aufgerufen werden.

<xsl:apply-templates select="." mode="RenderView" />

Als einzige Vorlage stimmt die Vorlage mit dem folgenden Starttag überein.

<xsl:template match="View" mode="RenderView">

Der Aufruf dieser unbenannten Vorlage weicht von den früheren Vorlagen in der Hierarchie in einem wichtigen Punkt ab. Die früheren Vorlagen haben nur die Quellknotenstruktur, die die Listenansicht definiert, als Informationsquelle verwendet. Zum Ausfüllen der HTML-Tabelle, mit der die Liste gerendert wird, sind jedoch Informationen zu dieser bestimmten Liste erforderlich, z. B. die Anzahl der darin enthaltenen Elemente (Zeilen) und die Werte bestimmter Felder in der Liste. Daher wird an diese Vorlage ein Parameter mit dem Namen thisNode übergeben, der die tatsächlichen Listendaten aus der Inhaltsdatenbank in Form von dsQueryResponse-Markup enthält. Bei jedem nachfolgenden Aufruf einer Vorlage oder bei der Anwendung der Vorlagen in einem bestimmten Modus, werden dieser Parameter und die aufgerufenen Vorlagen weitergegeben. Ein Beispiel für den Inhalt eines thisNode-Parameters finden Sie unter Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen.

Die Vorlage führt eine Schleife durch alle Zeilen (Listenelemente) in thisNode aus. Für jede Zeile werden Vorlagen mit Elementmodus angewendet, und es wird ein Verweis auf alle Felder in der Ansicht übergeben. Es folgen einige der wichtigen Zeilen.

<xsl:for-each select="$AllRows">
  <xsl:variable name="thisNode" select="."/>
  <!-- Matter omitted. The next lines run when the view does not include groups --> 
    <xsl:apply-templates mode="Item" select=".">
      <xsl:with-param name="Fields" select="$Fields"/>
      <!-- matter omitted -->
    </xsl:apply-templates>
  <!-- matter omitted -->
</xsl:for-each>

Die AllRows-Variable ist ein Verweis auf die Row-Elemente in thisNode. Es hat zwar den Anschein, als sei der aktuelle Knoten "." dem thisNode-Parameter mit dem select-Attribut zugewiesen, es handelt sich hierbei jedoch nur um einen Standardwert, den thisNode haben würde, falls kein Wert an die Vorlage übergeben worden wäre. Tatsächlich wird das dsQueryResponse-Markup als Parameter übergeben. Für jede Zeile in der Liste werden Vorlagen mit dem Modus Item angewendet, und es wird ein Fields-Parameter an sie übergeben. Letzterer ist ein Verweis auf alle FieldRef-Elemente in der Quellknotenstruktur.

Es sind mehrere Vorlagen mit dem Elementmodus vorhanden, aber nur eine stimmt mit dem Fall überein, dass der Listentyp 100 (generisch) ist und das Anzeigeformat 0. Es handelt sich um die erste Vorlage im Abschnitt Zeilenvorlagen. Sie besitzt das folgende Starttag.

<xsl:template mode="Item" match="Row">

Mit dieser Vorlage werden die <tr>-HTML-Start- und -Endtags eingefügt, mit denen die Zeile der Tabelle für das aktuelle Listenelement gerendert wird. Dazwischen wird eine Schleife durch alle Felder im Listenelement ausgeführt, und auf jedes Element werden Vorlagen im Modus printTbleCellEcbAllowed angewendet. Es folgen die wichtigen Zeilen.

<tr>

  <!-- matter omitted -->

  <xsl:for-each select="$Fields">

      <!-- matter omitted -->

      <xsl:apply-templates select="." mode="printTableCellEcbAllowed">
        <xsl:with-param name="thisNode" select="$thisNode"/>
      </xsl:apply-templates>

      <!-- matter omitted -->

  </xsl:for-each>

  <!-- matter omitted -->

</tr>

Als einzige Vorlage stimmt die Vorlage mit dem folgenden Starttag überein.

<xsl:template name="FieldRef_printTableCell_EcbAllowed" match="FieldRef" 
                   mode="printTableCellEcbAllowed" ddwrt:dvt_mode="body">

Mit dieser Vorlage werden die <td>-HTML-Start- und -Endtags eingefügt, mit denen die Zelle der Tabelle für das aktuelle Feld geformt wird. Zudem wird der Zelle eine Cascading Stylesheet (CSS)-Klasse zugewiesen. Zwischen den Start- und Endtags werden die Vorlagen des Modus PrintFieldWithECB wie hier gezeigt angewendet.

<td>

  <!-- matter omitted -->

  <xsl:apply-templates select="." mode="PrintFieldWithECB">

  <!-- matter omitted -->

</td>

Die entsprechende übereinstimmende Vorlage wird in fldtypes.xsl gefunden, so wie alle verbleibenden Vorlagen in der Hierarchie. Sie besitzt das ganz oben im nächsten Codeblock gezeigte Starttag. Diese Vorlage und die übrigen Vorlagen in der Kette rendern bestimmte Zellen in der HTML-Tabelle basierend darauf, ob die aktuelle Zeile eine Überschriftenzeile oder Datenzeile ist, und basierend auf dem Typ des Felds (z. B. Notiz oder Währung) und dem Basistyps des Felds (z. B. Text oder Zahl) sowie auf den Angaben, wie das Feld gerendert werden soll, z. B. als Klartext oder als Hyperlink zum Anzeigeformular. Es folgen die Starttags für die verbleibenden Vorlagen für ein Textfeld in einer Datenzeile. Jede Vorlage wird durch ihren Vorgänger entweder nach Namen oder als Ergebnis der Anwendung von Vorlagen eines bestimmten Modus aufgerufen.

<xsl:template name="FieldRef_NoMenu_PrintFieldWithECB" ddwrt:ECB="Menu" 
              match="FieldRef" mode="PrintFieldWithECB" ddwrt:ghost="always">

<xsl:template name="FieldRef_Ecb_PrintFieldWithDisplayFormLink" 
              ddwrt:ECB="Link" match="FieldRef[@LinkToItem]" 
              mode="PrintFieldWithDisplayFormLink" ddwrt:ghost="always">

<xsl:template name="FieldRef_PrintField" match="FieldRef" mode="PrintField" 
              ddwrt:dvt_mode="body" ddwrt:ghost="always">

<xsl:template name="PrintField" ddwrt:dvt_mode="body" ddwrt:ghost="always">

<xsl:template name="FieldRef_Text_body" ddwrt:dvt_mode="body" match ="FieldRef" 
              mode="Text_body">

Von der letzten dieser Vorlagen wird der Wert eines Textfelds in der Zelle der HTML-Tabelle schließlich gerendert. Es folgt das vollständige Markup für diese 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>

Beachten Sie, dass sich die Vorlage abhängig davon verzweigt, ob das Feld so definiert ist, dass Zeichenfolgen, die wie URLs aussehen, automatisch als <a>-Hyperlinks in HTML formatiert werden. Ist dies der Fall, dann werden wichtige Zeichen wie "<" und "&" nicht durch ihre entsprechenden Zeichenentitäten (&lt; und &amp;) ersetzt, wenn der das HTML für das Feld vom XSLT-Prozessor gerendert wird. Dies wäre für einen kompatiblen XSLT-Prozessor das Standardverhalten. Neben dieser Komplikation gibt die Vorlage einfach den Wert des Felds mit der folgenden Zeile aus.

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

Eine ausführlichere Erläuterung zu dieser Zeile finden Sie unter Gewusst wie: Anpassen des Renderings eines Felds in einer Listenansicht.

Siehe auch

Konzepte

Beispiele von Eingabe- und Ergebnisknotenstrukturen bei XSLT-Transformationen

Weitere Ressourcen

Listenansichten