SharePoint 2010: Formatear fecha en XSLT

Escenario:

Supongamos que queremos editamos la plantilla de estilos de elementos “ItemStyle.xsl” para poner nuestro estilo personalizado y mostrar la fecha  en la que se publicó el contenido, además del título con el enlace, el autor y la descripción.

Para ello no tendríamos más que añadir  una nueva plantilla xsl de la siguiente forma.

 

   1:        <xsl:template name="YourItemTemplateName" match="Row[@Style=YourItemTemplateName]" mode="itemstyle">
   2:          <xsl:variable name="SafeLinkUrl">
   3:              <xsl:call-template name="OuterTemplate.GetSafeLink">
   4:                  <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
   5:              </xsl:call-template>
   6:          </xsl:variable>
   7:          <xsl:variable name="DisplayTitle">
   8:              <xsl:call-template name="OuterTemplate.GetTitle">
   9:                  <xsl:with-param name="Title" select="@Title"/>
  10:                  <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
  11:              </xsl:call-template>
  12:          </xsl:variable>
  13:          <div class="divCustomItem">
  14:              <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
  15:              <div class="divTitle">
  16:                  <a href="{$SafeLinkUrl}" title="{@LinkToolTip}" class="linkTitle">
  17:                    <xsl:if test="$ItemsHaveStreams = 'True'">
  18:                      <xsl:attribute name="onclick">
  19:                        <xsl:value-of select="@OnClickForWebRendering"/>
  20:                      </xsl:attribute>
  21:                    </xsl:if>
  22:                    <xsl:if test="$ItemsHaveStreams != 'True' and @OpenInNewWindow = 'True'">
  23:                      <xsl:attribute name="onclick">
  24:                        <xsl:value-of disable-output-escaping="yes" select="$OnClickTargetAttribute"/>
  25:                      </xsl:attribute>
  26:                    </xsl:if>
  27:                    <xsl:value-of select="$DisplayTitle"/>
  28:                    
  29:                  </a>
  30:              </div>
  31:              <div class="divAdditionalData">
  32:                  por <xsl:value-of select="@Author"/> - <xsl:value-of select="@Created" />
  33:              </div>
  34:              <div class="divDescription">
  35:                  <xsl:value-of select="@Description" /> 
  36:              </div>
  37:          </div>
  38:      </xsl:template>

 

El resultado obtenido sería el siguiente:

 

Como se puede apreciar, la fecha se muestra con la hora incluida y… para este caso, no nos va a interesar que salga la hora y que la fecha esté formateada de la siguiente forma "08-02-2012

 

Solución:

Para empezar tendremos que importar el espacio de nombres xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime al nodo raíz de nuestra plantilla XSLT, con lo que debería quedar algo así:

<xsl:stylesheet 
  version="1.0" 
  exclude-result-prefixes="x d xsl msxsl cmswrt"
  xmlns:x="http://www.w3.org/2001/XMLSchema" 
  xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" 
  xmlns:cmswrt="http://schemas.microsoft.com/WebParts/v3/Publishing/runtime"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">

 

Una vez hecho esto, sólo nos quedará formatear la fecha de la siguiente forma dd-MM-yyyy. Para ello tenemos que hacer uso de la función FormatDateTime que se encuentra bajo el espacio de nombre que añadimos anteriormente y al que denominamos ddwrt

 

<xsl:value-of select="ddwrt:FormatDateTime(string(@Created) ,1033 ,'dd-MM-yyyy')" />

 

Con esto, el código nos quedaría de la siguiente forma.

 

   1:        <xsl:template name="YourItemTemplateName" match="Row[@Style=YourItemTemplateName]" mode="itemstyle">
   2:          <xsl:variable name="SafeLinkUrl">
   3:              <xsl:call-template name="OuterTemplate.GetSafeLink">
   4:                  <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
   5:              </xsl:call-template>
   6:          </xsl:variable>
   7:          <xsl:variable name="DisplayTitle">
   8:              <xsl:call-template name="OuterTemplate.GetTitle">
   9:                  <xsl:with-param name="Title" select="@Title"/>
  10:                  <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
  11:              </xsl:call-template>
  12:          </xsl:variable>
  13:          <div class="divCustomItem">
  14:              <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
  15:              <div class="divTitle">
  16:                  <a href="{$SafeLinkUrl}" title="{@LinkToolTip}" class="linkTitle">
  17:                    <xsl:if test="$ItemsHaveStreams = 'True'">
  18:                      <xsl:attribute name="onclick">
  19:                        <xsl:value-of select="@OnClickForWebRendering"/>
  20:                      </xsl:attribute>
  21:                    </xsl:if>
  22:                    <xsl:if test="$ItemsHaveStreams != 'True' and @OpenInNewWindow = 'True'">
  23:                      <xsl:attribute name="onclick">
  24:                        <xsl:value-of disable-output-escaping="yes" select="$OnClickTargetAttribute"/>
  25:                      </xsl:attribute>
  26:                    </xsl:if>
  27:                    <xsl:value-of select="$DisplayTitle"/>
  28:                    
  29:                  </a>
  30:              </div>
  31:              <div class="divAdditionalData">
  32:                  por <xsl:value-of select="@Author"/> - <xsl:value-of select="ddwrt:FormatDateTime(string(@Created) ,1033 ,'dd-MM-yyyy')" />
  33:              </div>
  34:              <div class="divDescription">
  35:                  <xsl:value-of select="@Description" /> 
  36:              </div>
  37:          </div>
  38:      </xsl:template>

 

Finalmente, el resultado sería el deseado: