imageWithData полезен при хранении двоичного файла изображения в базе данных или прогрессивно загрузке большого изображения от сети.
Вот код, который я написал для моего ASP.NET, который очень похож на ваш:
XDocument xDoc = XDocument.Load("output.xml");
XDocument transformedDoc = new XDocument();
using (XmlWriter writer = transformedDoc.CreateWriter())
{
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(XmlReader.Create(new StreamReader("books.xslt")));
transform.Transform(xDoc.CreateReader(), writer);
}
// now just output transformedDoc
Если у вас большой XSLT, вы можете сэкономить накладные расходы на его компиляцию во время выполнения, скомпилировав XSLT в сборку .NET при сборке вашего проекта (например, на этапе после сборки). Компилятор для этого называется xsltc.exe
и является частью Visual Studio 2008.
Для загрузки такого предварительно скомпилированного XSLT вам понадобится .NET Framework 2.0. SP1 или более поздняя версия, установленная на вашем сервере (эта функция была представлена в SP1).
В качестве примера см. Статью в блоге Антона Лапунова:
Если предварительная компиляция XSLT не выполняется вариант, который вам следует рассмотреть кэширование XslCompiledTransform
после его загрузки, чтобы вам не приходилось компилировать его каждый раз, когда вы хотите выполнить преобразование.
Нет времени на полный пример, но некоторые примечания:
Cache
для хранения скомпилированного XSL с зависимостью кеша от того, когда изменяется файл .XSLT. node.CreateNavigator (). ReadSubTree ()
. XPathNavigator.AppendChild
, чтобы получить XmlWriter
, который будет записывать в XML-документ. Поскольку вы упоминаете ASP.NET, возникает вопрос, можете ли вы использовать поток ответа непосредственно для вывода преобразования и можете ли вы использовать поток ввода напрямую, если это POST ...
Я бы переписал код следующим образом:
string path = HttpContext.Current.Server.MapPath("/xslt/" + xsltfile.Value);
XmlReader reader = CreateXmlReader(node.OuterXml);
string transformedXml = Transform(path, reader);
private XmlReader CreateXmlReader(string text)
{
StringReader reader = new StringReader(text);
return XmlReader.Create(reader);
}
private string Transform(string xsltPath, XmlReader source)
{
XsltCompiledTransform transformer = new XsltCompiledTransform();
transformer.Load(
xsltPath,
new XsltSettings(true, false),
new XmlUrlResolver());
StringWriter writer = new StringWriter();
transformer.Transform(source, null, writer);
return writer.ToString();
}
Причина, по которой я бы переписал код таким образом, заключается в том, что каждый блок кода теперь имеет одну и только одну цель. Это облегчает чтение и понимание. Кроме того, код требует меньше комментариев, поскольку много информации можно вывести из имен функции и ее параметров.