Миграция с класса XslTransform
Архитектура XLST была переработана в выпуске Visual Studio 2005. Класс XslTransform был заменен классом XslCompiledTransform.
В следующих разделах описаны некоторые основные различия между классами XslCompiledTransform и XslTransform.
Производительность
Класс XslCompiledTransform включает многочисленные улучшения производительности. Новый обработчик XSLT компилирует таблицу стилей XSLT до общего промежуточного формата аналогично среде CLR для других языков программирования. Скомпилированная таблица стилей может быть сохранена в кэше и повторно использована.
В класс XslCompiledTransform внесены и другие улучшения, благодаря которым его быстродействие выше, чем у класса XslTransform.
Примечание.
Хотя класс XslCompiledTransform имеет более высокий общий уровень производительности, чем класс XslTransform, метод Load класса XslCompiledTransform может выполняться медленнее, чем метод Load класса XslTransform при первом вызове преобразования. Причина этого заключается в необходимости компиляции XSLT-файла перед его загрузкой. Дополнительные сведения см. в записи блога XslCompiledTransform Slower than XslTransform? (Неужели 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 содержит несколько перегруженных методов Transform, которые возвращают результаты преобразования как объект 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 не обеспечивает встроенную поддержку этих функций. Однако их можно реализовать как функции расширения.