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)"));

}

При этом вывод изменится следующим образом:

XslTransform

Пространство имен 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 является таблицей стилей. Документ выглядит следующим образом:

 

  

   

    Price List

   

  

   

    

    

   

Перейти на страницу:

Похожие книги