Каков самый оптимизированный способ выполнить преобразование XSLT в ASP.NET?

imageWithData полезен при хранении двоичного файла изображения в базе данных или прогрессивно загрузке большого изображения от сети.

5
задан attack 12 August 2009 в 20:51
поделиться

5 ответов

Вот код, который я написал для моего 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
11
ответ дан 18 December 2019 в 06:51
поделиться

Если у вас большой XSLT, вы можете сэкономить накладные расходы на его компиляцию во время выполнения, скомпилировав XSLT в сборку .NET при сборке вашего проекта (например, на этапе после сборки). Компилятор для этого называется xsltc.exe и является частью Visual Studio 2008.

Для загрузки такого предварительно скомпилированного XSLT вам понадобится .NET Framework 2.0. SP1 или более поздняя версия, установленная на вашем сервере (эта функция была представлена ​​в SP1).

В качестве примера см. Статью в блоге Антона Лапунова:

XSLTC - Compile XSLT to .NET Assembly

Если предварительная компиляция XSLT не выполняется вариант, который вам следует рассмотреть кэширование XslCompiledTransform после его загрузки, чтобы вам не приходилось компилировать его каждый раз, когда вы хотите выполнить преобразование.

7
ответ дан 18 December 2019 в 06:51
поделиться

Нет времени на полный пример, но некоторые примечания:

  1. XML - это не то же самое, что System.String . Получите его из библиотеки классов как XDocument или XmlDocument; закончите с ним как XDocument или XmlDocument.
  2. Вы можете использовать ASP.NET Cache для хранения скомпилированного XSL с зависимостью кеша от того, когда изменяется файл .XSLT.
  3. Не преобразовывать XML в строку, а затем обратно в XML. Используйте node.CreateNavigator (). ReadSubTree () .
  4. Аналогичным образом используйте XPathNavigator.AppendChild , чтобы получить XmlWriter , который будет записывать в XML-документ.
3
ответ дан 18 December 2019 в 06:51
поделиться

Поскольку вы упоминаете ASP.NET, возникает вопрос, можете ли вы использовать поток ответа непосредственно для вывода преобразования и можете ли вы использовать поток ввода напрямую, если это POST ...

2
ответ дан 18 December 2019 в 06:51
поделиться

Я бы переписал код следующим образом:

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();
}

Причина, по которой я бы переписал код таким образом, заключается в том, что каждый блок кода теперь имеет одну и только одну цель. Это облегчает чтение и понимание. Кроме того, код требует меньше комментариев, поскольку много информации можно вывести из имен функции и ее параметров.

0
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: