2010-05-28 8 views
5

J'essaie de modifier le rendu d'une colonne de liste sur la page de liste.Rendu xsl personnalisé pour le champ de recherche en mode liste (SharePoint 2010)

Après quelques tutoriels et des cheveux tirant j'ai réussi à créer un xslt pour un calcul et champ monétaire (de fldtypes_XXXXXX.xsl):

<xsl:template match ="FieldRef[@Name='MarkCalc']" mode="Text_body"> 
    <xsl:param name="thisNode" select="."/> 
    <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping ="yes"/> 
</xsl:template> 

<xsl:template match="FieldRef[@Name='CurrencyTest']" mode="Number_body"> 
    <xsl:param name="thisNode" select="."/> 
    <b><xsl:value-of disable-output-escaping="yes" select="$thisNode/@*[name()=current()/@Name]" /></b> 
</xsl:template> 

Alors j'ai essayé de faire la même chose pour un champ de recherche, mais ça ne marchera pas. C'est ma dernière tentative (je l'ai copiée à partir du concepteur SharePoint). Qu'est-ce que je rate?

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" mode="Lookup_body"> 
    <xsl:param name="thisNode" select="."/> 
    <b><xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping="yes" /></b> 
</xsl:template> 

Répondre

8

En fait, il s'agit d'un problème entièrement xsl.

Le processeur Xsl choisit le modèle à utiliser en fonction des attributs "match" et "mode". Lorsque deux ou plusieurs modèles correspondent, celui à utiliser est choisi en priorité. Par défaut, trois niveaux de priorité sont attribués en fonction de la spécificité de votre correspondance.

De http://www.codetoad.com/xml/xslt8.asp:

  • modèles qui correspondent à une classe de noeuds, tels que *, qui correspond à tous les éléments , sont attribués une priorité implicite de -0,5

  • modèles qui correspondre à des noeuds en fonction de leur nom, tels que Caractère, qui correspond à des éléments, sont affectés une priorité implicite de 0

  • modèles qui correspondent à des noeuds en fonction de leur contexte, comme castmember/caractère, qui correspond à éléments dont le parent est un élément , se voient attribuer un priorité implicite de 0,5

Lors de l'attribution des priorités basées sur modèles, peu importe comment spécifique l'information de contexte est: si vous spécifiez un contexte pour un noeud puis le modèle a une priorité de 0,5. Par exemple, Description/Lien/Caractère a exactement la même priorité que Description // Caractère.

Dans SharePoint il existe deux modèles pour les champs de recherche

<xsl:template name="FieldRef_Lookup_body" match="FieldRef" mode="Lookup_body" ddwrt:dvt_mode="body">... 

et

<xsl:template match="FieldRef[@Encoded]" mode="Lookup_body" ddwrt:dvt_mode="body"> 

premier a priorité 0 (correspondance en fonction de son nom), le deuxième est prioritaire 0,5 (correspondance selon le contexte).

Mon modèle personnalisé doit passer outre codé recherche

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" mode="Lookup_body">... 

a également priorité par défaut de 0,5 (souvenez-vous, « ... peu importe la façon dont les informations de contexte est ... »), donc Le processeur xsl choisit le dernier défini (*).

Pour résoudre ce problème, vous pouvez utiliser la priorité d'attribut et la définir sur valeur supérieure à par rapport au modèle par défaut. Dans mon cas, je l'ai mis à 1.

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" priority="1" mode="Lookup_body">... 



(*) Apparemment charge SharePoint modèles personnalisés avant charger lui-même. Que ce soit un choix basé sur certains critères techniques ou pour m'assurer que j'apprends xsl, reste mystère.

+0

J'aime votre (*) note :) – Kai

0

J'ai eu un problème similaire, mais j'utilisais Sharepoint 2013. Dans Sharepoint 2013, cela est fait en utilisant le rendu côté client, donc cette méthode ne fonctionnera pas. Insted extraire http://www.sharepointnutsandbolts.com/2013/01/using-jslink-to-change-ui-of-sharepoint_20.html ou utiliser cette méthode (http://social.msdn.microsoft.com/Forums/sqlserver/en-US/9425e392-26ec-466b-a086-6581e035258f/sharepoint-2013-fldtypesxsl) pour forcer le rendu du serveur.