Vue d’ensemble du système de rendu d’affichage Liste XSLT

Dernière modification : mercredi 2 février 2011

S’applique à : SharePoint Foundation 2010

Cette rubrique fournit une vue d’ensemble du système de rendu d’affichage Liste dans Microsoft SharePoint Foundation. Avant de lire cette rubrique, vous devez posséder au moins une connaissance de base des concepts du langage XSLT (feuilles de style, modèles, paramètres, arborescences de nœuds, nœud de contexte, etc.).

Rendu des feuilles de style XSLT

Les feuilles de style XSLT fournies avec SharePoint Foundation résident dans des fichiers .xsl dans %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL. Parmi ces fichiers, les deux plus importants sont vwsytles.xsl et fldtypes.xsl. Le premier de ces fichiers fournit des feuilles de style pour le rendu des listes jusqu’au niveau des lignes. Le second fichier fournit des feuilles de style pour le rendu des champs particuliers (en d’autres termes, les cellules) dans les affichages Liste. Un vaste ensemble de variables XSLT globales est défini dans main.xsl.

Une feuille de style XSLT analyse une arborescence de nœuds source dans une certaine forme de langage XML et produit une arborescence de nœuds de résultat dans une autre forme de langage XML. Dans le cas le plus simple, l’arborescence source est transformée en arborescence de résultat. Cette tâche est assurée par le biais de modèles XSLT, chacun étant comparable à une règle qui détermine la façon dont un fragment spécifique du balisage source est transformé en fragment de résultat. Toutefois, la transformation ne doit pas nécessairement être une simple réexpression dans le langage de résultat de toutes les informations (et uniquement les informations) de l’arborescence de nœuds source. Une transformation peut exclure des informations de l’arborescence source et insérer dans le résultat des informations qui ne proviennent pas de la source. En particulier, un modèle XSLT peut combiner des informations de plusieurs arborescences de nœuds d’entrée. Chaque arborescence de nœuds d’entrée supplémentaire, parallèlement à l’arborescence de nœuds source, est transmise à un modèle en tant que paramètre. Les modèles XSLT de rendu d’affichage Liste de SharePoint Foundation possèdent deux arborescences de nœuds d’entrée :

  • L’arborescence de nœuds source est le balisage Schéma d'affichage qui définit l’affichage actuel de la liste. Il s’agit de l’arborescence que le processeur XSLT analyse et parcourt au moment de générer l’arborescence de résultat. Ainsi, à n’importe quel moment au cours de la transformation XSLT, le nœud de contexte du processeur XSLT est un nœud dans ce balisage.

  • L’arborescence du paramètre thisNode est transmise à chaque modèle de rendu de champ XSLT par le modèle appelant. Ce balisage contient les données réelles de la liste. Lors du rendu d’un champ, la valeur réelle de celui-ci est obtenue à partir de ce paramètre. Pour obtenir la référence complète du balisage dans le paramètre thisNode, voir XML dsQueryResponse.

Pour obtenir des exemples de ces arborescences de nœuds, voir Exemples d’arborescences de nœuds d’entrée et de résultat dans les transformations XSLT.

La hiérarchie de modèles XSLT

La hiérarchie de modèles XSLT dans SharePoint Foundation est relativement complexe. La chaîne d’appels aux modèles (via xsl:apply-templates et xsl:call-template) lors du rendu d’un affichage Liste varie en fonction de divers facteurs, notamment, du type de liste, de l’affichage Liste sélectionné, du style d’affichage et selon que l’affichage inclut le regroupement de lignes. Cette section décrit la chaîne d’appels la plus élémentaire possible dans le cas simple où l’utilisateur atteint une page contenant une liste présentant les caractéristiques suivantes :

  • la liste est de type 100 (générique) ;

  • l’identificateur BaseViewID de la liste a la valeur 1 ;

  • l’affichage utilise le style d’affichage 0 (tableau de base) ;

  • le regroupement de lignes n’est pas utilisé.

Le système de feuilles de style XSLT est appelé par l’événement PreRender de la page. Le modèle XSLT de niveau supérieur est le modèle sans nom déclaré dans vwsytles.xsl avec la balise de début suivante.

<xsl:template match="/">

Le comportement de ce modèle dépend du résultat de certains tests de type Boolean. Toutefois, dans le cas le plus simple, il appelle xsl:apply-templates pour les modèles du mode RootTemplate et sélectionne le nœud de contexte actif, qui est la racine de l’arborescence de nœuds source. (La variable XmlDefinition est définie dans main.xsl sous la forme ".", le nœud de contexte actif.)

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

Le modèle View_Default_RootTemplate est alors appliqué à l’élément View, qui est l’élément document, c’est-à-dire, l’élément supérieur de l’arborescence de nœuds source. (Voir Exemples d’arborescences de nœuds d’entrée et de résultat dans les transformations XSLT pour un exemple.) La balise de début de ce modèle est représentée ci-dessous.

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

Ce modèle construit l’élément HTML <table> qui restituera la liste. Il appelle des modèles connexes via les lignes suivantes.

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

Ces lignes appellent xsl:applytemplates pour les modèles du mode full et sélectionne le mode de contexte actif qui, à ce stade, est toujours l’élément View. Dans l’exemple de scénario d’affichage standard d’une liste générique, le seul modèle correspondant est le premier de la section View Templates de vwsytles.xsl. Il comporte la balise de début suivante.

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

Ce modèle initie le rendu de certains détails HTML de la liste et, surtout, il appelle d’autres modèles via la ligne suivante.

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

Le seul modèle correspondant est celui qui comporte la balise de début suivante.

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

L’appel à ce modèle sans nom diffère des modèles antérieurs de la hiérarchie sur un point important. Les modèles antérieurs utilisent l’arborescence de nœuds source, qui définit l’affichage Liste, uniquement comme source d’information. Or, pour compléter le tableau HTML qui restituera la liste, des informations sur cette liste particulière sont nécessaires, notamment le nombre d’éléments (lignes) qu’elle contient et les valeurs des champs particuliers de la liste. De ce fait, ce modèle est transmis à un paramètre nommé thisNode, qui contient les données de liste réelles de la base de données de contenu sous forme de balisage dsQueryResponse. Dès lors, chaque fois qu’un appel est effectué ou que les modèles d’un mode particulier sont appliqués, ce même paramètre est transmis aux modèles appelés. Pour un exemple de contenu de paramètre thisNode, voir Exemples d’arborescences de nœuds d’entrée et de résultat dans les transformations XSLT.

Le modèle parcourt en boucle toutes les lignes (éléments de liste) de thisNode. Pour chacune d’elles, il applique des modèles en mode Item et les transmet en tant que référence à tous les champs de l’affichage. Une partie des lignes importantes sont représentées ci-dessous.

<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>

La variable AllRows est une référence aux éléments Row de thisNode. Même s’il s’avère que le nœud actif "." est affecté à thisNode avec l’attribut select, il ne s’agit en réalité que de la valeur par défaut qu’aurait thisNode si rien n’était transmis au modèle. De fait, le balisage dsQueryResponse est transmis en tant que paramètre. Pour chaque ligne de la liste, les modèles en mode Item sont appliqués et un paramètre Fields leur est transmis. Ce dernier est une référence à tous les éléments FieldRef contenus dans l’arborescence de nœuds source.

Il existe plusieurs modèles en mode Item, mais un seul correspond au cas où le type de liste est 100 (générique) et le style d’affichage est 0. Il s’agit du tout premier modèle dans la section Row Templates de vwstyles.xsl. Il comporte la balise de début suivante.

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

Ce modèle insère les balises HTML de début et de fin <tr> qui restituent la ligne du tableau pour l’élément de liste actif. Entre les deux, il parcourt en boucle tous les champs de l’élément de liste et s’applique à chaque modèle du mode printTbleCellEcbAllowed. Les lignes importantes sont représentées ci-dessous.

<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>

Le seul modèle correspondant comporte la balise de début suivante.

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

Ce modèle insère les balises HTML de début et de fin <td> afin de former la cellule du tableau pour le champ actif. Il affecte également une classe CSS à la cellule. Entre les deux, la balise de début et la balise de fin, il applique des modèles du mode PrintFieldWithECB comme indiqué ici.

<td>

  <!-- matter omitted -->

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

  <!-- matter omitted -->

</td>

Le modèle correspondant approprié se trouve dans fldtypes.xsl, tout comme l’ensemble des modèles restants de la hiérarchie. Il comporte la balise de début représentée dans la partie supérieure du bloc de code suivant. Ce modèle et les modèles restants de la chaîne restituent des cellules particulières dans le tableau HTML qui varient selon que la ligne active est une ligne d’en-tête ou une ligne de données, selon le type du champ (Note ou Devise) et le type de base du champ (Texte ou Numérique) et selon la façon dont le champ doit être restitué (par exemple sous forme de texte brut ou de lien vers le formulaire d’affichage). Les balises de début suivantes sont celles des modèles restants pour un champ Texte dans une ligne de données. Chacun est appelé par son prédécesseur soit par le nom, soit à la suite de l’application de modèles d’un mode particulier.

<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">

Le dernier des modèles ci-dessus est celui qui restitue finalement la valeur d’un champ Texte dans la cellule du tableau HTML. Le code suivant représente le balisage entier de ce modèle.

<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>

Notez que le modèle peut se ramifier selon que le champ est défini pour mettre automatiquement en forme les chaînes qui ressemblent à des URL en tant que liens HTML <a>. Auquel cas, lorsque le processeur XSLT restitue le HTML pour le champ, il ne remplace pas les caractères importants, tels que « < » et « & », par leur entité de caractère équivalente (&lt; et &amp;), ce que ferait par défaut un processeur XSLT compatible. Mise à part cette difficulté, le modèle émet simplement la valeur du champ avec la ligne suivante.

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

Pour obtenir une description détaillée de cette ligne, voir Procédure : personnaliser le rendu d’un champ d’un affichage de liste.

Voir aussi

Concepts

Exemples d’arborescences de nœuds d’entrée et de résultat dans les transformations XSLT

Autres ressources

Affichages de liste