Вы можете попробовать использовать другую XslCompiledTransform.Transform метод перегрузки , который принимает путь строки и XmlWriter :
XslCompiledTransform xslTransformer = new XslCompiledTransform();
xslTransformer.Load(Server.MapPath("Test.xslt"));
// XmlWriter allows you to specify additional settings
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;
using (MemoryStream ms = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
xslTransformer.Transform(Server.MapPath("Test.xml"), writer);
}
ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(ms);
string output = sr.ReadToEnd();
ms.Close();
}
Response.Write(output);
На самом деле, есливас интересует только рендеринг XML в строку, вы можете использовать StringBuilder
в качестве цели без MemoryStream
и упростить свой код до:
XslCompiledTransform xslTransformer = new XslCompiledTransform();
xslTransformer.Load(Server.MapPath("Test.xslt"));
StringBuilder sb = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sb))
{
xslTransformer.Transform(Server.MapPath("Test.xml"), writer);
}
Response.Write(sb.ToString());
[Редактировать] (на основе вашего комментария)
Если входной XML находится в строке, вы можете использовать еще одну перегрузку метода XslCompiledTransform.Transform
: Transform(XmlReader, XmlWriter)
.
XmlReader
может быть (среди прочих способов) реализован с использованием конкретной реализации TextReader
, в данном случае StringReader
.Вы также можете использовать другой поток в качестве входных данных.
Когда вы соберете все это вместе, вы должны получить:
string input = @"<SomeXml />"
StringBuilder output = new StringBuilder();
using (StringReader strReader = new StringReader(input))
{
using (XmlReader reader = XmlReader.Create(strReader))
{
using (XmlWriter writer = XmlWriter.Create(output))
{
xslTransformer.Transform(reader, writer);
}
}
}
Response.Write(output.ToString());
Все эти классы реализуют IDisposable
, поэтому вам нужночтобы убедиться, что они утилизируются после использования.