Filed Under (C# code) by Christiaan van Bergen on January-22-2008
Zoals velen natuurlijk al weten kan je xml-data middels een stylesheet weergeven op een door jou gewenste manier. Je kan in de zgn. xslt gebruik maken van xpath queries en diverse transformaties. Maar op het moment dat je je niet zo’n held voelt op dit gebied dan moet het toch prettig zijn te weten dat je kan terugvallen op je vertrouwde C# (of andere .Net taal).
Voordat je je eigen code vanuit xslt kan aanroepen moet je uiteraard wel wat voorbereidend werk verrichten.
Laten we eens kijken naar onderstaande code. Deze method Transform krijgt een string die de xml data en een string die de stylesheet bevat. Deze twee worden samengevoegd en het uiteindelijke resultaat wordt als string teruggegeven.
public static string Transform(string xmlData, string xslStylesheet)
{
TextReader textreaderxml - new StringReader(xmlData);
XmlTextReader xmlreaderxml = new XmlTextReader(textreaderxml);
TextReader textreaderxsl = new StringReader(xslStylesheet);
XmlTextReader xmlreaderxsl = new XmlTextReader(textreaderxsl);
XPathDocument xpathdocument = new XPathDocument(xmlreaderxml);
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xmlreaderxsl);
StringBuilder sb = new StringBuilder();
TextWriter tw = new StringWriter(sb);
XsltArgumentList args = new XsltArgumentList();
args.AddExtensionObject(“http://voorbeeld.xslt.nl/calculatie”,
new XsltCalculatie());
xslt.Transform(xpathdocument, args, tw);
return sb.ToString();
}
De uiteindelijke transformatie van de xml volgens de stylesheet gebeurt in regel 18. Maar daar voor (regel 4) wordt een verwijzing gemaakt naar http://voorbeeld.xslt.nl/calculatie. Dit is een utility class geschreven in C# die de functie Round bevat. (Toegegeven, dit is natuurlijk niet spannend)
public Decimal Round(Decimal a, int b){ return Math.Round(a, b);}
Deze C# code wordt in regel 17(-18) in de Transform method toegevoegd aan de stylesheet als zijnde de plek waar gekeken moet worden voor elke verwijzing naar http://voorbeeld.xslt.nl/calculatie (ofwel Local)
De uiteindelijke output van de method Transform en het gewenste resultaat: