views:

268

answers:

1

The following code works but is messy and slow. I am transforming an XDocument to another XDocument using XSLT2 with Saxon, adapted using SaxonWrapper:

public static XDocument HSRTransform(XDocument source)
{
    System.Reflection.Assembly thisExe = System.Reflection.Assembly.GetExecutingAssembly();
    System.IO.Stream xslfile = thisExe.GetManifestResourceStream("C2KDataTransform.Resources.hsr.xsl");

    XmlDocument xslDoc = new XmlDocument();
    xslDoc.Load(xslfile);

    XmlDocument sourceDoc = new XmlDocument();
    sourceDoc.Load(source.CreateReader());

    var sw = new StringWriter();

    Xsl2Processor processor = new Xsl2Processor();
    processor.Load(xslDoc);

    processor.Transform(sourceDoc, new XmlTextWriter(sw));

    XDocument outputDoc = XDocument.Parse(sw.ToString());
    return outputDoc;
}

I realise that the slowness might actually be in the bits I have no control over but are there better ways to do all the switching between XDocument and XmlDocument and usage of writers?

+2  A: 

Rather than using strings to create the XDocument you can try passing in an XmlWriter created from the XDocument directly:

XDocument outputDoc = new XDocument();
processor.Transform(sourceDoc, outputDoc.CreateWriter());
return outputDoc;

Other than that the other slowdowns are probably in the SaxonWrapper itself and it's use of the older XmlDocument - rather than it's speedier cousin.

eddiegroves
Thanks - that tidies it up nicely.
Daniel Skinner