Ватсон Карли
Шрифт:
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;
// выполнить преобразование
transForm.Transform(nav, argBook, xw);