To perform an XSLT transformation, you just need a couple of lines in C#:
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load(XsltFilename); xslt.Transform(XmlInputFilename, XmlOutputFilename);
By the way, the PowerShell version of this code snippet is here.
This code works fine unless the XML file contains elements with undeclared namespaces.
While working on wpxslgui, I noticed that newer versions of the WordPress XML export format included the atom: namespace without declaring it:
<atom:link rel="search" type="application/opensearchdescription+xml" href="https://devio.wordpress.com/osd.xml" title="devioblog" /> <atom:link rel='hub' href='https://devio.wordpress.com/?pushpress=hub'/>
In case you ever tried my app on an XML file containing these elements, you get the error message
System.Xml.XmlException: ‘atom’ is an undeclared namespace
To fix the problem, you need to open the XML file in an editor, navigate to the line given in the error message, and delete the lines starting with the <atom:link element. Done
Of course, programmers love programming, and finding solutions. We need to declare the namespace before opening (and parsing) the XML file, and this is achieved by using an XmlReader containing the namespace declaration:
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load(XsltFilename); // prepare XML input StreamReader sr = new StreamReader(XmlInputFilename, System.Text.Encoding.Default); NameTable nt = new NameTable(); XmlNamespaceManager mgr = new XmlNamespaceManager(nt); mgr.AddNamespace("atom", "urn:atom"); XmlParserContext xpc = new XmlParserContext(nt, mgr, "", XmlSpace.Default); XmlReaderSettings rds = new XmlReaderSettings(); rds.ConformanceLevel = ConformanceLevel.Document; XmlReader rd = XmlReader.Create(sr, rds, xpc); // prepare transformation StreamWriter wr = new StreamWriter(XmlOutputFilename); xslt.Transform(rd, new XsltArgumentList(), wr); // cleanup wr.Flush(); wr.Close(); rd.Close();
[The code does not contain exception handling (file not found, file system permissions, etc) for clarity]