Чтение онлайн

на главную

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

private void button1_Click(object sender, System.EventArgs e) {

 //изменить в соответствии со структурой путей доступа

 XPathDocument doc=new XPathDocument("..\\..\\..\\booksxpath.XML");

 //создать XPathNavigator

 XPathNavigator nav=((IXPathNavigable)doc).CreateNavigator;

 //создать XPathNodeIterator узлов book,

 // которые имеют novel значением атрибута genre

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

<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
):

Поделиться:
Популярные книги

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Младший сын князя

Ткачев Андрей Сергеевич
1. Аналитик
Фантастика:
фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Младший сын князя

Попала, или Кто кого

Юнина Наталья
Любовные романы:
современные любовные романы
5.88
рейтинг книги
Попала, или Кто кого

Имперец. Том 4

Романов Михаил Яковлевич
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 4

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Приручитель женщин-монстров. Том 2

Дорничев Дмитрий
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Возрождение Феникса. Том 1

Володин Григорий Григорьевич
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Возрождение Феникса. Том 1

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

В теле пацана

Павлов Игорь Васильевич
1. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана