using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
namespace Cncic.Utility
{
/// <summary>
/// Transformer performs an XSLT Transformation.
/// It can be re-used, and is (probably) thread-safe.
/// </summary>
public class XsltTransformer
{
private XmlDocument m_objXMLDoc;
private XslTransform m_objXSLTransform;
public XsltTransformer()
{
m_objXMLDoc = new XmlDocument();
m_objXSLTransform = new XslTransform();
}
// With an XmlDocument
public void setXML(XmlDocument input)
{
m_objXMLDoc = input;
}
// With an input stream
public void setXML(Stream input)
{
if (input != null)
m_objXMLDoc.Load(input);
}
// With an XML reader
public void setXML(XmlReader reader)
{
if (reader != null)
m_objXMLDoc.Load(reader);
}
// With a plain string
public void setXML(string strXML)
{
if (strXML.Length > 0)
m_objXMLDoc.LoadXml(strXML);
}
public string getXML()
{
if (m_objXMLDoc != null)
return m_objXMLDoc.InnerXml;
else
return null;
}
// With a plain stringpath
public void setXSL(string strXMLPath)
{
if (strXMLPath.Length > 0)
m_objXSLTransform.Load(strXMLPath);
}
// With an XmlDocument instance
public void setXSL(XmlDocument xsl)
{
m_objXSLTransform.Load(xsl.DocumentElement.CreateNavigator());
}
public void Transform(System.IO.TextWriter output)
{
XPathNavigator navigator = m_objXMLDoc.DocumentElement.CreateNavigator();
XmlTextWriter writer = new XmlTextWriter(output);
m_objXSLTransform.Transform(navigator, null, writer);
}
public void Transform(Stream stream,Encoding encode)
{
XPathNavigator navigator = m_objXMLDoc.DocumentElement.CreateNavigator();
XmlTextWriter writer = new XmlTextWriter(stream,encode);
m_objXSLTransform.Transform(navigator, null, writer);
}
public void Transform(Stream stream, Encoding encode,XsltArgumentList xsltArg)
{
XPathNavigator navigator = m_objXMLDoc.DocumentElement.CreateNavigator();
XmlTextWriter writer = new XmlTextWriter(stream, encode);
m_objXSLTransform.Transform(navigator,xsltArg, writer);
}
public string TransformToString()
{
XPathNavigator navigator = m_objXMLDoc.DocumentElement.CreateNavigator();
&fb%�7p; StringBuilder sb = new "8tringBuilder();
StringWriter swriter = new StringWriter(sb);
XmlTextWriter writer = new XmlTextWriter(swriter);
m_objXSLTransform.Transform(navigator, null, writer);
return sb.ToString();
}
#region I used to use XSLT to transform XML that I get from an Oracle database and write the output to a file:
//Transforms Xml with Xslt and write to file
//protected void TransformXmlToFile(XmlDocument xmlDoc,
// string xsltPath,
// string transformedXmlPath)
//{
// XslTransform transform = new XslTransform();
// XmlTextWriter xmlWriter = new XmlTextWriter(transformedXmlPath);
// transform.Load(xsltPath);
// xmlWriter.WriteStartDocument();
// transform.Transform(xmlDoc, Nothing, xmlWriter, Nothing);
// xmlWriter.Close();
//}
//After some testing we started to experience problems with this approach and I decided to rather transform the XML and return a XmlDocument as the output... the solution is to use a MemoryStream for the output and then load that into your XmlDocument. Or create a string or whatever you want to return:
//Transforms Xml with Xslt and returns the transformed XmlDocument
//protected XmlDocument TransformXml(XmlDocument xmlDoc, string xsltPath)
//{
// MemoryStream memStream = new MemoryStream();
// XslTransform transform = new XslTransform();
// transform.Load(xsltPath);
// transform.Transform(xmlDoc, Nothing, memStream, Nothing);
// memStream.Seek(0, SeekOrigin.Begin);
// XmlDocument transformedDoc = new XmlDocument();
// return transformedDoc.Load(memStream);
//}
#endregion
}
}