Работа с XML в .NET - XSL-преобразование документа
ОГЛАВЛЕНИЕ
XSL-преобразование документа
Extensible Stylesheet Language (XSL) - язык для преобразования XML-данных. Преобразования XSLT иногда называют стилем (stylesheet). С помощью XSL легко разделять данные и их представление. Данные в этом случае хранятся в XML-файлах, а XSL содержит шаблон HTML страницы, определяющий то, как будут отображаться данные, и XSL-инструкции, указывающие как данные будут размещаться в шаблоне. XSL позволяет использовать одну схему для большого класса документов, имеющих одинаковую структуру. XSL-преобразования могут осуществляться программно (например, с помощью класса XslTransform) или браузером на клиенте, путем включения тега ?xml-stylesheet, указывающего на XSL-файл.
XSL-преобразования могут применяться и для преобразования XML-документов в XML-документы с другим форматом. Такая необходимость может возникнуть при передаче информации между разными информационными системами или организациями, использующими различные типы описания одной и той же информации. В нашей программе мы преобразуем документ с заказами в аналогичный документ, но с тегами на английском. Рассмотрим функцию для этого преобразования.
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Файлы XML (*.xml)|*.xml";
if (dlg.ShowDialog() != DialogResult.OK)
return;
string file = dlg.FileName;
// получаем xsl файл
dlg.Filter = "Файлы XSL (*.xslt)|*.xslt";
if (dlg.ShowDialog() != DialogResult.OK)
return;
string fileXsl = dlg.FileName;
// получаем имя выходного файла
SaveFileDialog dlgSave = new SaveFileDialog();
dlgSave.FileName = "transform";
dlgSave.DefaultExt = "xml";
dlgSave.Filter = "Файлы XML (*.xml)|*.xml";
if (dlgSave.ShowDialog() != DialogResult.OK)
return;
string fileOut = dlgSave.FileName;
XmlTextWriter writer = null;
try
{
XPathDocument doc = new XPathDocument(file);
XslTransform xsl = new XslTransform();
writer = new XmlTextWriter(fileOut, System.Text.Encoding.Unicode);
xsl.Load(fileXsl);
xsl.Transform(doc, null, writer, (XmlResolver)null);
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + ex.Message);
}
finally
{
if (writer != null)
writer.Close();
}
Пользователь указывает имя входного и выходного XML-файлов и XSL-файла. В выходной файл информация записывается с помощью XmlTextWriter, о котором говорилось ранее. Объект XslTransform загружает XSL-файл методом Load и выполняет преобразование, сохраняя данные в writer. Вторым параметром передаются параметры XsltArgumentList, применяемые при преобразовании. Четвертым параметром передается объект XmlResolver, нужный для разрешений ссылок на внешние ресурсы.
Мы использовали следующим XSL-файл, в котором описаны соответствия между тегами на русском и английском языке.
<?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Заказы">
<Orders>
<xsl:apply-templates select="Заказ" />
</Orders>
</xsl:template>
<xsl:template match="Заказ">
<Order>
<xsl:attribute name="Date">
<xsl:value-of select="@Дата" />
</xsl:attribute>
<xsl:attribute name="Address">
<xsl:value-of select="@Адрес" />
</xsl:attribute>
<xsl:apply-templates select="Товар" />
</Order>
</xsl:template>
<xsl:template match="Товар">
<Good>
<xsl:attribute name="Price">
<xsl:value-of select="@Цена" />
</xsl:attribute>
<xsl:attribute name="Name">
<xsl:value-of select="@Название" />
</xsl:attribute>
</Good>
</xsl:template>
</xsl:stylesheet>
В результате преобразования в выходном документе все теги изменились, а структура осталось прежней.
<Orders>
<Order Date="21.04.2004" Address="Уфа">
<Good Price="100" Name="Товар_А"></Good>
<Good Price="150" Name="Товар_Б"></Good>
<Good Price="370" Name="Товар_В"></Good>
</Order>
<Order Date="24.04.2004" Address="Москва">
<Good Price="400" Name="Товар_Г"></Good>
</Order>
<Order Date="28.04.2004" Address="Омск">
<Good Price="255" Name="Товар_Д"></Good>
</Order>
</Orders>