using System;
using System.Reflection;
using System.Xml;
using System.Xml.Xsl;
using System.IO;
using System.Text;
namespace MapReuser
{
///
/// Преобразует XML документы с помощью XSLT
///
public class BizTalkMap
{
///
/// Кэш XSLT.
///
private Stream xsltStream;
///
/// Кэш XSLT аргументов.
///
private Stream xsltArguments;
///
/// Кэш XslTransform.
///
private XslTransform xslTransform;
///
/// Кэш XSltArgumentList.
///
private XsltArgumentList xslArgumentList;
///
/// Constructor.
///
/// Поток XSLT в виде XML.
/// Поток Extension Objects в виде XML.
public BizTalkMap(Stream XsltStream, Stream XsltArguments)
{
xsltStream = XsltStream;
xsltArguments = XsltArguments;
}
///
/// Преобразует документ и возвращает результат в виде потока.
///
/// Поток преобразуемых данных (XML).
/// Поток преобразованных данных (XML).
public Stream TransformInstance(Stream inXml)
{
XslTransform transform = Transform;
XmlDocument xmlInputDoc = new XmlDocument();
xmlInputDoc.Load(inXml);
// Создаем поток в памяти для хранения преобразованных данных
MemoryStream outStream = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(outStream, System.Text.Encoding.UTF8);
// Опции форматирования XML
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.Indentation = 2;
// Преобразуем
transform.Transform(xmlInputDoc, TransformArgs, xmlWriter, null);
// Устанавливаем курсор на начало потока
outStream.Seek(0, SeekOrigin.Begin);
return outStream;
}
///
/// Возвращает экземпляр класса XslTransform.
///
private XslTransform Transform
{
get
{
if (xslTransform == null)
{
// Инициализируем XslTransform
XmlTextReader xsltReader = new XmlTextReader(xsltStream);
XslTransform transformTemp = new XslTransform();
transformTemp.Load(xsltReader, (XmlResolver) null, GetType().Assembly.Evidence);
// Кэшируем объект XslTransform
xslTransform = transformTemp;
}
return xslTransform;
}
}
///
/// Возвращает объект XsltArgumentList, сформированный из Extension Object XML.
///
private XsltArgumentList TransformArgs
{
get
{
if (xslArgumentList == null)
{
XmlDocument xmlExtension = new XmlDocument();
XsltArgumentList xslArgList = new XsltArgumentList();
if (xsltArguments != null)
{
// Загружаем список XSLT аргументов и создаем все необходимые экземпляры классов
xmlExtension.Load(xsltArguments);
XmlNodeList xmlExtensionNodes = xmlExtension.SelectNodes(«//ExtensionObjects/ExtensionObject»);
foreach (XmlNode extObjNode in xmlExtensionNodes)
{
XmlAttributeCollection extAttributes = extObjNode.Attributes;
XmlNode namespaceNode = extAttributes.GetNamedItem(«Namespace»);
XmlNode assemblyNode = extAttributes.GetNamedItem(«AssemblyName»);
XmlNode classNode = extAttributes.GetNamedItem(«ClassName»);
Assembly extAssembly = Assembly.Load(assemblyNode.Value);
object extObj = extAssembly.CreateInstance(classNode.Value);
xslArgList.AddExtensionObject(namespaceNode.Value, extObj);
}
}
// Кэшируем список
xslArgumentList = xslArgList;
}
return xslArgumentList;
}
}
}
}