XPathNodeIterator iter=nav.Select("/bookstore/book[@genre="novel']");
while(iter.MoveNext) {
LoadBook(iter.Current.Clone);
}
// добавим разделительную линию и вычислим сумму
listBox1.Items.Add("========================");
listBox1.Items.Add("Total Cost = "
+ nav.Evaluate("sum(/bookstore/book[@genre='novel']/price)"));
}
При этом вывод изменится следующим образом:
Пространство имен 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
является таблицей стилей. Документ выглядит следующим образом: