.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 во входные параметры и типы возвращаемых функций расширения. Однако время от времени он жалуется на неподдерживаемый тип. Какие поддерживаются типы?