Работа с 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>