c# - metodos - un método de extensión debe definirse en una clase estática no genérica
¿Cuáles son los tipos de retorno de.NET permitidos a partir de un método de objeto de extensión XSLT? (1)
.NET permite extender XSLT utilizando el llamado objeto de extensión. Muy práctico y muy conveniente. Lo haces creando una clase:
public class VeryHandyExtensionFunctions
{
public string VerySmartStringConcat(XPathNodeIterator NodeList)
{
return "some very smart string concat based on NodeList";
}
}
dependiendo de la magia (ver más abajo), puede referirse a VerySmartStringConcat como parte de su xslt:
<xsl:value-of select="someprefix:VerySmartStringConcat(nodes[@withsomeattribute])"/>
Lo único que se debe hacer para que esto suceda es pasar una instancia de su clase de extensión (VeryHandyExtensionFunctions anterior) a la clase XslCompiledTransform, utilizando una XsltArgumentList:
XsltArgumentList xsltArg = new XsltArgumentList();
xsltArg.AddExtensionObject("SomeUriResolvingToSomePrefix",new VeryHandyExtensionFunctions);
XslCompiledTransform xslTransform;
XmlWriter W = XmlWriter.Create(SomeTarget, Xslt.OutputSettings);
xslTransform.Transform(SomeXmlDocument, xsltArg, W);
.NET es bastante inteligente al descubrir cómo convertir los tipos de XML a los parámetros de entrada y los tipos de devolución de las funciones de extensión. Sin embargo, de vez en cuando se queja de un tipo que no es de soporte. ¿Cuáles son los tipos compatibles?
Después de algunas investigaciones encontré esto en http://msdn.microsoft.com/en-us/magazine/bb986125.aspx :
3C XPath Type -> Equivalente .NET Class (Type)
String -> System.String
Booleano -> System.Boolean
Número -> Sistema.Doble
Fragmento de árbol de resultados -> System.Xml.XPath.XPathNavigator
Node Set -> System.Xml.XPath.XPathNodeIterator