Реализация классом XslTransform XSLT-процессора
Обновлен: November 2007
![]() |
---|
Класс XslTransform в версии .NET Framework, версия 2.0 устарел. Можно выполнять XSLT-преобразование, используя класс XslCompiledTransform. Дополнительные сведения см. в разделах Использование класса XslCompiledTransform и Миграция с класса XslTransform. |
Класс XslTransform является XSLT-процессором, реализующим рекомендации по XSL-преобразованиям (XSLT) версии 1.0. Метод Load находит и считывает таблицы стилей, а метод Transform преобразует исходный документ. В качестве исходного документа для метода XslTransform может служить любое хранилище, реализующее интерфейс IXPathNavigable. Платформа .NET Framework в настоящее время реализует интерфейс IXPathNavigable в классах XmlDocument, XmlDataDocument и XPathDocument, поэтому все они могут использоваться в качестве источника документов для преобразования.
Объект XslTransform в платформе .NET Framework поддерживает только спецификацию XSLT 1.0, определенную со следующим пространством имен:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
Загрузить таблицу стилей можно, вызвав метод Load из одного из следующих классов:
XPathNavigator
XmlReader
Строка, представляющая URL-адрес
Существует другой метод Load для каждого из приведенных выше входных классов. Некоторые методы принимают в качестве аргументов сочетание одного из этих классов и класса XmlResolver. Класс XmlResolver находит ресурсы, на которые ссылаются элементы <xsl:import> или <xsl:include> в таблице стилей. Следующие методы в качестве входного значения принимают строку: XmlReader и XPathNavigator.
Overloads Public Sub Load(String)
public void Load(string);
Overloads Public Sub Load(String, XmlResolver)
public void Load(string, XmlResolver);
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
public void Load(XmlReader, XmlResolver, Evidence);
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
public void Load(XPathNavigator, XmlResolver, Evidence);
Большая часть приведенных выше методов Load принимает в качестве параметра объект XmlResolver. Объект XmlResolver используется для загрузки таблицы стилей и всех таблиц стилей, на которые имеются ссылки в элементах xsl:import и xsl:include.
Большинство методов Load также принимает свидетельство в качестве параметра. Параметр-свидетельство является объектом Evidence, связанным с таблицей стилей. Уровень безопасности таблицы стилей влияет на уровень безопасности всех последующих ресурсов, на которые она ссылается, например содержащийся в ней сценарий, все вызываемые функции document() и все объекты расширения, используемые объектом XsltArgumentList.
Если таблица стилей загружается с помощью метода Load, содержащего параметр URL-адреса и не содержащего свидетельства, свидетельство таблицы стилей вычисляется путем объединения этого URL-адреса с его веб-узлом и зоной.
Если URI или свидетельство отсутствуют, то свидетельство таблицы стилей считается полностью доверенным. Не загружайте таблицы стилей из ненадежных источников и не добавляйте ненадежные объекты расширения в объект XsltArgumentList.
Дополнительные сведения об уровнях безопасности и свидетельстве, а также о его влиянии на сценарии см. в разделе Создание сценариев таблиц стилей XSLT с помощью <msxsl:script>. Сведения об уровнях безопасности и свидетельстве, а также о его влиянии на объекты расширения см. в разделе XsltArgumentList для параметров таблицы стилей и объектов расширения.
Сведения об уровнях безопасности и свидетельстве, а также о его влиянии на функцию document() см. в разделе Разрешение внешних таблиц стилей XSLT и документов.
Таблицу стилей можно предоставить с рядом входных параметров. Таблица стилей может также вызывать функции в объектах расширения. Как параметры, так и объекты расширения предоставляются таблице стилей с помощью объекта XsltArgumentList. Дополнительные сведения о классе XsltArgumentList см. в разделе Элементы XsltArgumentList.
Рекомендованное безопасное использование класса XslTransform
Права доступа таблицы стилей зависят от предоставленного свидетельства. В следующей таблице представлено расположение таблицы стилей и объясняется соответствующий тип свидетельства.
Сценарий |
Предоставляемый тип свидетельства |
---|---|
Таблица стилей XSLT не имеет внешних ссылок или поступает из доверенного кода. |
Предоставьте свидетельство из собственной сборки: |
Таблица стилей XSLT поступает из внешнего источника. Происхождение источника известно, существует поддающийся проверке URI. |
Создайте свидетельство с помощью этого URI. |
Таблица стилей XSLT поступает из внешнего источника. Происхождение источника неизвестно. |
Присвойте свидетельству значение null. Блоки сценария не обрабатываются, функция XSLT document() не поддерживается, привилегированные объекты расширения запрещены. Кроме того, можно также присвоить параметру resolver значение null. Это гарантирует, что элементы xsl:import и xsl:include не будут обрабатываться. |
Таблица стилей XSLT поступает из внешнего источника. Происхождение источника неизвестно, но необходима поддержка сценариев. |
Запросите свидетельство у вызывающего. |
Преобразование XML-данных
После загрузки таблицы стилей преобразование начинается с вызова методов Transform и предоставления исходного документа источника. Метод Transform перегружен, чтобы обеспечить разные выходные данные преобразования. Преобразование может завершиться следующими выходными форматами:
Строковый URL-адрес файла
Последний формат, строковый URL-адрес файла, является наиболее распространенной ситуацией при преобразовании исходного документа, находящегося по определенному URL-адресу, и записи этого документа в выходной URL-адрес. Метод Transform является самым удобным для загрузки XML-документа из файла, выполнения XSLT-преобразования и записи выходных данных в файл. При этом не нужно создавать и загружать исходный документ с последующей записью в файловый поток. В следующем образце кода показано применение метода Transform при использовании строкового URL-адреса в качестве входных и выходных данных:
Dim xsltransform As XslTransform = New XslTransform()
xsltransform.Load("favorite.xsl")
xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing)
XslTransform xsltransform = new XslTransform();
xsltransform.Load("favorite.xsl");
xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);
Преобразование раздела XML-документа
Преобразования применяются к документу в целом. Иными словами, если передать узел, отличный от корневого узла документа, это не помешает процессу преобразования обратиться ко всем узлам загружаемого документа. Чтобы преобразовать фрагмент результирующего дерева, необходимо создать объект XmlDocument, содержащий только фрагмент результирующего дерева, и передать этот объект XmlDocument методу Transform. В следующем примере выполняется преобразование фрагмента результирующего дерева.
Dim xslt As New XslTransform()
xslt.Load("print_root.xsl")
Dim doc As New XmlDocument()
doc.Load("library.xml")
' Create a new document containing just the result tree fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the result tree fragment
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
XslTransform xslt = new XslTransform();
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the result tree fragment.
XmlNode testNode = doc.DocumentElement.FirstChild;
XmlDocument tmpDoc = new XmlDocument();
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the result tree fragment
// to the Transform method.
Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl");
xslt.Transform(tmpDoc, null, Console.Out, null);
Пример использует в качестве входных данных файлы library.xml и print_root.xsl и выводит на консоль следующее:
Passing <book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book> to print_root.xsl
Root node is book.
library.xml
<library>
<book genre='novel' ISBN='1-861001-57-5'>
<title>Pride And Prejudice</title>
</book>
<book genre='novel' ISBN='1-81920-21-2'>
<title>Hook</title>
</book>
</library>
print_root.xsl
<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" >
<output method="text" />
<template match="/">
Root node is <value-of select="local-name(//*[position() = 1])" />
</template>
</stylesheet>
Миграция XSLT с платформы .NET Framework версии 1.0 на платформу .NET Framework версии 1.1
В следующей таблице показаны устаревшие методы платформы .NET Framework версии 1.0 и новые методы платформы .NET Framework версии 1.1 для метода Load. Новые методы позволяют ограничить разрешения таблицы стилей, указывая свидетельство.
Устаревшие методы Load платформы .NET Framework версии 1.0 |
Заменяющие их методы Load платформы .NET Framework версии 1.1 |
---|---|
Load(XPathNavigator input); Load(XPathNavigator input, XmlResolver resolver); |
Load(XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence); |
Load(IXPathNavigable stylesheet); Load(IXPathNavigable stylesheet, XmlResolver resolver); |
Load(IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence); |
Load(XmlReader stylesheet); Load(XmlReader stylesheet, XmlResolver resolver); |
Load(XmlReader stylesheet, XmlResolver resolver, Evidence evidence); |
В следующей таблице показаны устаревшие и новые методы для метода Transform. Новые методы принимают объект XmlResolver.
Устаревшие методы Transform платформы .NET Framework версии 1.0 |
Заменяющие их методы Transform платформы .NET Framework версии 1.1 |
---|---|
XmlReader Transform(XPathNavigator input, XsltArgumentList args) |
XmlReader Transform(XPathNavigator input, XsltArgumentList args, XmlResolver resolver) |
XmlReader Transform(IXPathNavigable input, XsltArgumentList args) |
XmlReader Transform(IXPathNavigable input, XsltArgumentList args, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output) |
Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, XmlWriter output) |
Void Transform(IXpathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output) |
Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output) |
Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, Stream output) |
Void Transform(XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output) |
Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver) |
Void Transform(String input, String output); |
Void Transform(String input, String output, XmlResolver resolver); |
Свойство XslTransform.XmlResolver устарело в платформе .NET Framework версии 1.1. Вместо него используются новые перегрузки метода Transform, принимающие объект XmlResolver.
См. также
Основные понятия
XSLT-преобразования с помощью класса XslTransform
XPathNavigator в преобразованиях
XPathNodeIterator в преобразованиях
Ввод XPathDocument в XslTransform
Ввод XmlDataDocument в XslTransform
Ввод XmlDocument в XslTransform