Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Архитектура XSLT была изменена в выпуске Visual Studio 2005. Класс XslTransform был заменен классом XslCompiledTransform .
В следующих разделах описываются некоторые основные различия между классом XslCompiledTransform и классом XslTransform.
Производительность
Класс XslCompiledTransform включает множество улучшений производительности. Новый процессор XSLT компилирует таблицу стилей XSLT вплоть до общего промежуточного формата, аналогично тому, что выполняет среда CLR для других языков программирования. После компиляции таблицы стилей ее можно кэшировать и повторно использовать.
Класс XslCompiledTransform также включает другие оптимизации, которые делают его гораздо быстрее, чем XslTransform класс.
Замечание
Хотя общая производительность класса XslCompiledTransform лучше, чем класса XslTransform, метод Load класса XslCompiledTransform может выполняться медленнее, чем метод Load класса XslTransform при первом вызове с преобразованием. Это связано с тем, что перед загрузкой XSLT-файл должен быть скомпилирован. Дополнительные сведения см. в следующей записи блога: XslCompiledTransform Медленнее XslTransform?
Безопасность
По умолчанию XslCompiledTransform класс отключает поддержку функции XSLT document() и внедренного скрипта. Эти функции можно включить, создав XsltSettings объект с включенными функциями и передав его в Load метод. В следующем примере показано, как включить скрипты и выполнить преобразование XSLT.
Замечание
Блоки скриптов поддерживаются только в .NET Framework. Они не поддерживаются в .NET Core или .NET 5 или более поздней версии.
// Create the XsltSettings object with script enabled.
XsltSettings settings = new XsltSettings(false,true);
// Execute the transform.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("calc.xsl", settings, new XmlUrlResolver());
xslt.Transform("books.xml", "books.html");
' Create the XsltSettings object with script enabled.
Dim settings As New XsltSettings(False, True)
' Execute the transform.
Dim xslt As New XslCompiledTransform()
xslt.Load("calc.xsl", settings, New XmlUrlResolver())
xslt.Transform("books.xml", "books.html")
Дополнительные сведения см. в разделе "Вопросы безопасности XSLT".
Новые возможности
Временные файлы
Временные файлы иногда создаются во время обработки XSLT. Если таблица стилей содержит блоки скриптов или если параметр отладки имеет значение true, временные файлы могут быть созданы в папке %TEMP%. Могут возникать случаи, когда некоторые временные файлы не удаляются из-за неудобного времени. Например, если файлы используются текущим доменом приложения или отладчиком, финализатор объекта TempFileCollection не сможет их удалить.
Свойство TemporaryFiles можно использовать для дополнительной очистки, чтобы убедиться, что все временные файлы удаляются из клиента.
Поддержка элемента xsl:output и XmlWriter
Класс XslTransform проигнорировал xsl:output параметры при отправке XmlWriter выходных данных преобразования в объект. Класс XslCompiledTransform имеет OutputSettings свойство, которое возвращает XmlWriterSettings объект, содержащий выходные данные, производные от xsl:output элемента таблицы стилей. Объект XmlWriterSettings используется для создания XmlWriter объекта с правильными параметрами, которые можно передать методу Transform . Следующий код C# иллюстрирует это поведение:
// Create the XslTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(stylesheet);
// Load the file to transform.
XPathDocument doc = new XPathDocument(filename);
// Create the writer.
XmlWriter writer = XmlWriter.Create(Console.Out, xslt.OutputSettings);
// Transform the file and send the output to the console.
xslt.Transform(doc, writer);
writer.Close();
Настройка отладки
Класс XslCompiledTransform может создавать сведения об отладке, что позволяет отлаживать таблицу стилей с помощью отладчика Microsoft Visual Studio. См. XslCompiledTransform(Boolean) для получения дополнительной информации.
Различия в поведении
Преобразование в XmlReader
Класс XslTransform имеет несколько перегрузок преобразования, возвращающих результаты преобразования в качестве XmlReader объекта. Эти перегрузки можно использовать для загрузки результатов преобразования в представление в памяти (например XmlDocument , или XPathDocument) без накладных расходов на сериализацию и десериализацию результирующего XML-дерева. В следующем коде C# показано, как загрузить результаты преобразования в XmlDocument объект.
// Load the style sheet
XslTransform xslt = new XslTransform();
xslt.Load("MyStylesheet.xsl");
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
doc.Load(xslt.Transform(input, (XsltArgumentList)null));
Класс XslCompiledTransform не поддерживает преобразование в XmlReader объект. Однако можно сделать что-то подобное с помощью метода CreateNavigator для загрузки результирующего XML-дерева непосредственно из XmlWriter. В следующем коде C# показано, как выполнить ту же задачу с помощью XslCompiledTransform.
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) {
xslt.Transform(input, (XsltArgumentList)null, writer);
}
Поведение по усмотрению
Рекомендация по преобразованиям W3C XSL (XSLT) версии 1.0 включает области, в которых поставщик реализации может решить, как справиться с ситуацией. Эти области считаются дискреционным поведением. Существует несколько областей, в которых поведение XslCompiledTransform отличается от поведения XslTransform класса. Дополнительные сведения см. в разделе "Ошибки XSLT для восстановления".
Объекты расширения и функции скриптов
XslCompiledTransform вводит два новых ограничения на использование функций скрипта:
Из выражений XPath могут вызываться только открытые методы.
Перегрузки отличаются друг от друга на основе количества аргументов. Если несколько перегрузок имеют одинаковое количество аргументов, будет выброшено исключение.
В XslCompiledTransform привязка (поиск имени метода) к функциям скрипта происходит во время компиляции, и таблицы стилей, которые работали с XslTransform, могут вызвать исключение при загрузке с XslCompiledTransform.
XslCompiledTransform поддерживает наличие дочерних элементов msxsl:using и msxsl:assembly в элементе msxsl:script. Элементы msxsl:using и msxsl:assembly используются для объявления дополнительных пространств имен и сборок для использования в блоке скрипта. Дополнительные сведения см. в разделе "Блоки скриптов" с помощью msxsl:script .
XslCompiledTransform запрещает создание объектов расширения, у которых есть несколько перегрузок с одинаковым количеством аргументов.
Функции MSXML
В класс XslCompiledTransform добавлена поддержка дополнительных функций MSXML. В следующем списке описаны новые или улучшенные функциональные возможности:
msxsl:node-set: XslTransform требуется аргумент функции node-set, который должен быть фрагментом дерева результатов. Этот XslCompiledTransform класс не имеет этого требования.
msxsl:version: эта функция поддерживается в XslCompiledTransform.
Функции расширения XPath: функция ms:string-compare, функция ms:utc, функция ms:namespace-uri, функция ms:local-name, функция ms:number, функция ms:format-date и функция ms:format-time теперь поддерживаются.
Функции расширения XPath, связанные с схемой: эти функции не поддерживаются в стандартной версии XslCompiledTransform. Однако их можно реализовать как функции расширения.