Страница 6 из 7 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="https://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> |