.NET позволяет расширять XSLT с помощью так называемого объекта расширения. Очень удобно и очень удобно. Вы делаете это, создавая класс:
public class VeryHandyExtensionFunctions
{
public string VerySmartStringConcat(XPathNodeIterator NodeList)
{
return "some very smart string concat based on NodeList";
}
}
в ожидании некоторой магии (см. ниже), вы можете обратиться к VerySmartStringConcat как часть вашего xslt:
<xsl:value-of select="someprefix:VerySmartStringConcat(nodes[@withsomeattribute])"/>
Единственное, что нужно сделать для того, чтобы это произошло, - передать экземпляр вашего класса расширения (VeryHandyExtensionFunctions выше) в класс XslCompiledTransform, используя 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 довольно разумно разбирается в том, как преобразовать типы XML в входные параметры и вернуть типы функций расширения. Однако время от времени он жалуется на не тип поддержки. Какие поддерживаемые типы?