Rendering a Field with the Custom XSLT Stylesheet

In MOSS 2007, how a field is rendered in a list view relies on its <RenderPattern> element which defines the actual CAML that SharePoint can use to render the field. However in SharePoint 2010, the list view rendering system has been changed significantly to rely on the XSLT stylesheets. To understand how different are the two ways, let’s take a build-in column, Target Audiences, as an example.

In both MOSS 2007 and SharePoint 2010, when we enable target audiences setting on a list, a Target Audiences column will be added to the list. Its field type definition is like the following.

 <?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
    <FieldType>
        <Field Name="TypeName">TargetTo</Field>
        <Field Name="ParentType">Note</Field>
        <Field Name="TypeDisplayName">
          $Resources:spscore,FieldTypes_Audience_DisplayName;
        </Field>
        <Field Name="TypeShortDescription">
          $Resources:spscore,FieldTypes_Audience_ShortDescription;
        </Field>
        <Field Name="UserCreatable">FALSE</Field>
        <Field Name="FieldTypeClass">
          Microsoft.Office.Server.WebControls.FieldTypes.SPFieldTargetTo,Microsoft.Office.Server,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c
        </Field>
        <Field Name="ShowOnSurveyCreate">FALSE</Field>
        <PropertySchema>
            <Fields>
                <Field Name="AllowGlobalAudience" 
                       DisplayName="$Resources:spscore,FieldTypes_Audience_AllowGlobalAudience;" 
                       Type="Boolean"> 
                    <Default>1</Default>
                </Field> 
                <Field Name="AllowDL" 
                       DisplayName="$Resources:spscore,FieldTypes_Audience_AllowDistributionList;" 
                       Type="Boolean"> 
                    <Default>1</Default>
                </Field> 
                <Field Name="AllowSPGroup" 
                       DisplayName="$Resources:spscore,FieldTypes_Audience_AllowSharepointGroup;" 
                       Type="Boolean"> 
                    <Default>1</Default>
                </Field> 
            </Fields>
        </PropertySchema>
        <RenderPattern Name="DisplayPattern">            
        <Switch>
            <Expr><Column/></Expr>
        <Case Value="">
        $Resources:spscore,FieldTypes_Audience_NotTargeted;
      </Case>
        <Case Value=";;;;">
        $Resources:spscore,FieldTypes_Audience_NotTargeted;
      </Case>
        <Default>
        $Resources:spscore,FieldTypes_Audience_Targeted;
      </Default>
        </Switch>
    </RenderPattern>
    </FieldType>
</FieldTypes>

The <RenderPattern> here defines how this field is rendered. That is, when the value of this field is empty or “;;;;”, it shows No. Otherwise, it shows Yes. The following is a screenshot of this column in a MOSS list.

image

However in SharePoint 2010, although the field type definition of this field is the same as the definition in MOSS, the rendering in the list view is different. The following is a screenshot in a SharePoint 2010 list.

image

Why the rendering is so different is because by default SharePoint 2010 does not use <RenderPattern> anymore when rendering a field in the list view. Instead, SharePoint 2010 uses XSLT stylesheets to transform the source tree of the list view into the result tree, and the location of the OOB xsl files is %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL.

To make the Target Audiences column to be rendered the same as it rendered in MOSS, we just need to create a custom XSLT stylesheet, put it in the above folder and reset the application pool. The following is the XSLT I wrote to render this column.

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:x="https://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="https://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='Target_x0020_Audiences']" 
                  mode="Note_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>
        <span style="color:red">
            <xsl:choose>
                <xsl:when test="$FieldValue='' or $FieldValue=';;;;'">
                    No
                </xsl:when>
                <xsl:otherwise>
                    Yes
                </xsl:otherwise>
            </xsl:choose>
        </span>
    </xsl:template>

</xsl:stylesheet>

After applying the above XSLT, the Target Audiences column is rendered as below.

image

Finally, if you want SharePoint 2010 to render your field with <RenderPattern> anyway, you must include a <Field Name="CAMLRendering">TRUE</Field> in your field type definition.

Reference: Overview of XSLT List View Rendering System