При этом вывод изменится следующим образом:
Пространство имен System.Xml.Xsl
содержит классы XSL, применяемые .NET. XslTransform
может использоваться с любым хранилищем, которое реализует интерфейс IXPathNavigable
. В настоящее время на платформе .NET это: XmlDocument
, XmlDataDocument
и XPathDocument
. Так же как и в случае XPath, воспользуйтесь тем хранилищем, которое подходит лучшим образом. Если планируется создание заказного хранилища, такого как файловая система, и желательно иметь возможность выполнять преобразования, не забудьте реализовать в классе интерфейс IXPathNavigable
.
XslTransform
основывается на потоковой модели запросов. В связи с этим можно соединить несколько преобразования вместе. Можно даже применять, если нужно, между преобразованиями заказной объект чтения. Это предоставляет большую гибкость при проектировании.
В первом примере, который мы рассмотрим, берется документ books.xml
и преобразуется в простой документ HTML для вывода. (Этот код можно найти в папке XPathXSLSample3
.) Необходимо будет добавить следующие операторы using
:
using System.IO;
using System.Xml.Xsl;
using System.Xml.XPath;
Вот код, выполняющий преобразование:
private void button1_Click(object sender System.EventArgs e) {
//создать новый XPathDocument
XPathDocument doc=new XPathDocument('..\..\..\booksxpath.XML');
// создать новый XslTransForm
XslTransform transForm=new XslTransform();
transForm.Load('..\..\..\books.xsl');
// этот FileStream будет нашим выводом
FileStream fs=new FileStream('..\..\..\booklist.html', FileMode.Create);
// Создать Navigator
XPathNavigator nav=((IXPathNavigable)doc).CreateNavigator();
// Выполнить преобразование. Файл вывода создается здесь.
transForm.Transform(nav, null, fs);
}
Сделать это преобразование проще почти невозможно. Сначала создается объект на основе XPathDocument
и объект на основе XslTransform
. Затем файл bookspath.xml
загружается в doc
, a books.xsl
в transForm
. В этом примере для записи нового документа HTML на диск создается объект FileStream
.
Если бы это было приложение ASP.NET, мы использовали бы объект TextWriter
и передавали бы его в объект HttpResponse
. Если бы мы преобразовывали в другой документ XML, то применялся бы объект на основе XmlWriter
. После того как объекты XPathDocument
и XslTransform
будут готовы, мы создаем XPathNavigator
на doc
и передаем nav
и этот stream
в метод Transform
объекта transForm
. XslTransform
имеет несколько перегружаемых версий, получающих комбинации навигаторов, XsltArgumentList
(подробнее об этом позже) и потоков ввода/вывода. Параметром навигатора может быть XPathNavigator
или любой объект, реализующий интерфейс IXPathNavigable
. Потоки ввода/вывода могут быть TextWriter
, Stream
или объектом на основе XmlWriter
.
Документ books.xsl
является таблицей стилей. Документ выглядит следующим образом:
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<html>
<head>
<title>Price List</title>
</head>
<body>
<table>
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match='bookstore'>
<xsl:apply-templates select= 'book'/>
</xsl:template>
<xsl:template match='book'>
<tr><td>
<xsl:value-of select='title'/>
</td><td>
<xsl:value-of select='price'/>
</td></tr>
</xsl:template>
</xsl:stylesheet>
Ранее упоминался объект XsltArgumentList
. Это способ, которым можно объект с методами связать с пространством имен. Когда это сделано, можно вызывать методы во время преобразования. Рассмотрим пример, чтобы понять, как это работает (находится в XPathXSLSample4
):
private void button1_Click(object sender, System.EventArgs e) {
// новый XPathDocument
XPathDocument doc=new XPathDocument('..\..\..\booksxpath.xml');
// новый XslTransform
XslTransform transForm=new XslTransform();
transForm.Load('..\..\..\booksarg.xsl');
// новый XmlTextWriter, так как мы создаем новый документ xml
XmlWriter xw=new XmlTextWriter(..\..\..\argSample.xml', null);
// создать XslArgumentList и новый объект BookUtils
XsltArgumentList argBook=new XsltArgumentList();
BookUtils bu=new BookUtils();
// это сообщает список аргументов BookUtils
argBook.AddExtensionObject('urn:ProCSharp', bu);
// новый XPathNavigator
XPathNavigator nav=((IXPathNavigable)doc).CreateNavigator();
// выполнить преобразование