[MOSS] Llamadas a métodos .NET desde un Xsl (ContentByQueryWebPart)

En ocasiones puede ser necesario que desde un Xsl tengamos que llamar a un método .NET. En mi caso era para parsear el valor de un campo que contiene un Xml.

Lo primero será crearnos una clase para definir los métodos que vamos a llamar desde nuestros Xsl:

public class XsltCustomFunctions
{
    #region Variables
 
    /// <summary>
    /// Singleton Instance
    /// </summary>
    static readonly XsltCustomFunctions instance = new XsltCustomFunctions();
 
    #endregion
 
    #region Properties
 
    /// <summary>
    /// Gets the instance.
    /// </summary>
    /// <value>The instance.</value>
    public static XsltCustomFunctions Instance
    {
        get
        {
            return instance;
        }
    }
 
    #endregion
 
    #region Constructor
 
    /// <summary>
    /// Initializes the <see cref="XsltCustomFunctions"/> class.
    /// </summary>
    static XsltCustomFunctions()
    {
 
    }
 
    /// <summary>
    /// Initializes a new instance of the <see cref="XsltCustomFunctions"/> class.
    /// </summary>
    XsltCustomFunctions()
    {
 
    }
 
    #endregion
 
    #region Methods
 
    #region public
 
    /// <summary>
    /// Gets the average.
    /// </summary>
    /// <param name="xml">The XML.</param>
    /// <returns></returns>
    public string GetAverage(string xml)
    {
        string response = String.Empty;
 
        if (!String.IsNullOrEmpty(xml))
        {
            ///
        }
 
        return response;
    }
 
    #endregion
 
    #endregion
}

Lo siguiente que tenemos que hacer es añadir un ExtensionObject para poder llamar a los métodos de la clase que creamos anteriormente. Esto lo vamos a hacer sobreescribiendo el método ModifyXsltArgumentList del ContentQueryByWebPart:

public class MyContentByQueryWebPart : ContentByQueryWebPart
{
    /// <summary>
    /// Modifies the XSLT argument list.
    /// </summary>
    /// <param name="argList">The arg list.</param>
    protected override void ModifyXsltArgumentList(ArgumentClassWrapper argList)
    {
        argList.AddExtensionObject("http://www.midominio.es/Assembly/XsltCustomFunctions", 
            TC.REDILC.Common.XsltCustomFunctions.Instance);
 
        base.ModifyXsltArgumentList(argList);
    }
}

El primer parámetro es el namespace (Puedes poner el que tu quieras en mi caso uso el nombre de la empresa + nombre de assembly + clase) que luego usaremos en el Xsl y el segundo es una instancia de la clase que creamos anteriormente.

Como veis, se hace uso del patrón Singleton para no estar creando un monton de instancias cada vez que se llama al método y así mejorar el performance y ahorrar memoria.

Por último solo nos queda crear el Xsl y llamar a nuestro método. Lo primero registrar el namespace que usamos cuando añadimos el ExtensionObject:

<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:geeksms="http://www.midominio.es/Assembly/XsltCustomFunctions">

Y por último la llamada al método:

<div class="average">
    <xsl:value-of select="geeksms:GetAverage(Xml)" />
</div>
Espero que os sirva, un saludo y buen finde para todos :)
Published 5/2/2010 8:48 por Luis Ruiz Pavón
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2010/02/05/moss-llamadas-a-m-233-todos-net-desde-un-xsl-contentbyquerywebpart.aspx