SlideShare a Scribd company logo
1 of 59
XML to XML -
преобразования
http://ProductivityBlog.com.ua
О чем пойдет речь
▪ Начинаем с простого
▪ Копаем глубже
▪ Другие функции
▪ Визуальное XML to XML преобразование
с MapForce
▪ Практика
Файлы и инструменты
Файлы практических работ в файле
XSLT_2.zip в папке Practice
XMLSpy, MapForce из пакета
ALTOVA MissionKit
Начинаем с простого
▪ <xsl:stylesheet>
▪ <xsl:output>
▪ Практика
▪ <xsl:template>
▪ <xsl:copy-of>
▪ Практика
▪ Промежуточные итоги
<xsl:stylesheet>
▪ Таблицы стилей XSLT – это тоже XML-файлы
<?xml version="1.0" encoding="UTF-8"?>
▪ Корневой элемент
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
▪<xsl:функция атрибут=“значение”>
<xsl:output>
▪ Непосредственно вложен в корневой элемент
▪ Задает формат для выходного файла
▪ method – тип файла
▪ xml, html, text
▪ encoding – кодировка
▪ indent – отступы тегов для лучшей читабельности
▪ <xsl:output method=“xml” version=“1.0” encoding=“UTF-8”
indent=“yes”/>
Практика –
создание XSLT-файла
▪Создать новый файл в XMLSpy
▪выбрать XSLT 1.0
▪выбрать Generic XSL/XSLT Transformation
▪Сохранить файл под именем
xml2xml1.xslt
Готовый файл можно найти в папке Chapter2transformations
<xsl:template>
▪ Определяет какие данные войдут в
результирующий файл
▪ Чтобы взять все данные из исходного файла:
<xsl:template match=“/”>
</xsl:template>
<xsl:copy-of>
▪ Копирование данных и структуры их исходного
файла
▪ Xpath-функция node() копирует текущий
элемент
▪в нашем случае – корневой (предыдущий слайд)
<xsl:copy-of select=“node()”/>
Практика –
редактирование XSLT-файла
▪В файл xml2xml1.xslt добавить теги
xsl:template и xsl:copy-of
Готовый файл можно найти в папке Chapter2transformations
Практика –
преобразование из XML
▪ Открыть в XMLSpy файл reading_list.xml
▪ В меню XSL/XQuery выбрать Assign XSL
▪ Выбрать xml2xml1.xslt
▪ Отметить опцию “Make a path relative…”
▪ Запустить трансформацию (F10, меню, тулбар)
▪ Сохранить файл как Output1.xml
▪ Валидировать файл (F8, тулбар)
Готовый файл можно найти в папке Chapter2transformations
Практика –
преобразование из XSLT
▪ Перейти во вкладку с файлом xml2xml1.xslt
▪Project and Entry Helpers
▪ Кликнуть на иконке XML
▪Выбрать reading_list.xml
▪ Запустить трансформацию (F10, меню, тулбар)
Готовый файл можно найти в папке Chapter2transformations
Промежуточные итоги
▪ Мы изучили структуру
XSLT-файлов
▪ Научились создавать их
▪ <xsl:copy-of> позволяет просто
скопировать содержимое файла
▪ Преобразование можно запустить
из XML или XSLT
Копаем глубже
▪ Файл схемы
▪ <xsl-for-each>
▪ Cтруктура элементов
▪ <xsl:attribute>
▪ <xsl:value-of>
▪ Практика
Файл схемы
▪ XML-файлы структурируются в соответствии со
схемой
▪ Пример
▪ Библиотека: каждая книга имеет название (плюс год
и язык) и автора
▪Мы хотим взять данные из reading_list.xml и
преобразовать в форму, соответствующую схеме
библиотеки
Файл схемы
<xsl:for-each>
▪ Отбирает набор элементов и позволяет
перебрать и обработать их один за другим
▪ Пример:
<xsl:for-each select=“/reading_list/book”>
<xsl:copy-of select=“author”>
</xsl:for-each>
Скорее всего, полученный файл не будет валидным XML-файлом.
Как думаете, почему?
Структура элементов
▪ Чтобы создать структуру в выходном файле,
нужно
▪добавить имена элементов – теги
▪добавить атрибуты – xsl:attribute
▪чуть позже 
Пример для
reading_list_schema.xsd
<reading_list>
<xsl:for-each select=“/reading_list/book”>
<book>
<title/>
<author/>
<year/>
</book>
</xsl:for-each>
</reading_list>
Пример для library_schema.xsd
<library>
<xsl:for-each select=“/reading_list/book”>
<book>
<writer/>
<title/>
</book>
</xsl:for-each>
</library>
Замечания к примерам
▪ Структура будет правильной, но пока без
атрибутов
▪ select внутри xsl:for-each использует имя
элемента из ИСХОДНОГО файла
▪ ОСТАЛЬНЫЕ теги соответствуют
результирующей схеме
<xsl:attribute>
<title>
<xsl:attribute name=“first_edition”>
2011
</xsl:attribute>
<xsl:attribute name=“language”>
en
</xsl:attribute>
Name of book
</title>
В продолжение примера
<library
xsi:noNamespaceSchemaLocation=
"library_schema.xsd” xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance">
</library>
Вариант 2
<library>
<xsl:attribute
name=“xsi:noNamespaceSchemaLocation”
namespace=
"http://www.w3.org/2001/XMLSchema-instance">
library_schema.xsd”
</xsl:attribute>
</library>
<xsl:attribute> - продолжение
<library
xsi:noNamespaceSchemaLocation=
"library_schema.xsd”
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance">
<xsl:for-each select=“/reading_list/book”>
<book>
<writer>
Name of author
</writer>
<title first_edition=“2011” language=“en”>
Name of book
</title>
</book>
</xsl:for-each>
</library>
<xsl:value-of>
▪ Помещает в результирующий файл данные из
исходного
▪XPath-выражение в атрибуте select
▪названия – из ИСХОДНОГО файла
<xsl:value-of select=“/reading_list/book[2]/title”/>
<xsl:value-of> - пример
<book>
<writer>
<xsl:value-of select=“author”/>
</writer>
<title>
<xsl:attribute name=“first_edition”>
<xsl:value-of select=“year”/>
</xsl:attribute>
<xsl:attribute name=“language”>
<xsl:value-of select=“title/@lang”/>
</xsl:attribute>
<xsl:value-of select=“title”/>
</title>
</book>
Замечания к примеру
▪ В примере – простое копирование значений
▪ Встроенные функции позволяют менять
значения на лету
▪ Сравните
<xsl:value-of select=“author”/>
и
<xsl:value-of select=“concat (‘Mr. ‘,author)”/>
Практика –
изменение структуры данных
▪ Сохранить xml2xml1.xslt под именем xml2xml2.xslt
▪ Добавить все преобразования, рассмотренные в этом
уроке
▪ подсказка: <xsl:for-each select="//book">
▪ Запустить преобразование
▪ Сохранить результат как Output2.xml
▪ Валидировать файл
Готовый файл можно найти в папке Chapter2transformations
Преобразование результатов
преобразования
▪ Вместо одного сложного XSLT-файла можно
выполнить цепочку простых преобразований
▪ Например, преобразовать Output2.xml в
соответствии со схемой library_schema2.xsd
▪ почти то же самое
▪ имя автора разбито на два элемента – имя и
фамилия
▪ функции substring-before() и substring-after()
▪ для случая когда имя не содержит пробелов и отделено
пробелом от фамилии
Практика –
извлечение частичных данных
▪ Сохранить xml2xml2.xslt под именем xml2xml2А.xslt
▪ Поменять имя схемы на library_schema2.xsd
▪ Поменять теги внутри цикла для извлечения имени и фамилии
автора
▪ Установить Output2.xml в качестве исходного файла
▪ Запустить преобразование
▪ Сохранить результат под именем Output2A.xml
Готовый файл можно найти в папке Chapter2transformations
<xsl:for-each select="//book">
<book>
<writer>
<Fname>
<xsl:value-of select="substring-before(writer, ' ')" />
</Fname>
<Lname>
<xsl:value-of select="substring-after(writer, ' ')" />
</Lname>
</writer>
<xsl:copy-of select="title" />
</book>
Практика –
извлечение частичных данных
Другие функции
▪ <xsl:sort>
▪ сортировка результатов
▪ <xsl:if>
▪ проверка условий
▪ <xsl:choose>
▪ <xsl:apply-templates>
<xsl:sort>
▪ Сортировка набора элементов. часто – внутри
цикла <xsl:for-each>
▪select – по какому ключу сортировать
▪ может быть несколько
▪order – порядок сортировки
▪data-type – название говорит за себя
▪ number или text (по умолчанию)
<xsl:sort> - пример
<xsl:for-each select=“//book”>
<xsl:sort select=“author” order=“descending”/>
<xsl:sort select=“year” data-type=“number”/>
</xsl:for-each>
▪ Добавить в файл xml2xml2.xslt:
▪сортировку по автору в порядке убывания
▪сортировку по году издания
▪ Запустить трансформацию
▪ Сохранить файл под именем xml2xml3.xslt
▪ Сохранить результат под именем Output3.xml
Практика –
сортировка результатов
<xsl:if>
▪ Изменение результирующих значений в
зависимости от истинности условия
▪по сути, упрощенный условный оператор
▪ нет ветви else
▪test – условие (TRUE или FALSE)
<xsl:if> - пример
<writer>
<xsl:if test=“sex=‘M’”>Mr.</xsl:if>
<xsl:if test=“sex=‘F’”>Ms.</xsl:if>
<xsl:value-of select=“author”/>
</writer>
▪ Сохранить xml2xml3.xslt как xml2xml4.xslt
▪ Изменить атрибут language тега title
<xsl:attribute name=“language”>
<xsl:if test=“title/@lang=‘en’”>English</xsl:if>
<xsl:if test=“title/@lang=‘fr’”>French</xsl:if>
</xsl:attribute>
▪ Запустить трансформацію
▪ Сохранить результат как Output4.xml
Практика –
проверка условий
<xsl:choose>
▪ Проверка нескольких условий – аналог
оператора варіанта
▪xsl:when с атрибутом test
▪xsl:otherwise
▪ необязательно, но это хорошая практика
<xsl:choose> - пример
<xsl:choose>
<xsl:when test=“sex=‘M’”>Male</xsl:when>
<xsl:when test=“sex=‘F’”>Female</xsl:when>
<xsl:otherwise>Unknown</xsl:otherwise>
<xsl:choose>
▪ Удалить из файла xml2xml4.xslt элементы xsl:if
▪ Использовать xsl:choose для атрибута language
тега title
▪ Сохранить файл как xml2xml5.xslt
▪ Запустить трансформацію
▪ Сохранить результат как Output5.xml
Практика –
проверка нескольких условий
<xsl:attribute name="language">
<xsl:choose>
<xsl:when test="title/@lang='en'">English</xsl:when>
<xsl:when test="title/@lang='fr'">French</xsl:when>
<xsl:when test="title/@lang='es'">Spanish</xsl:when>
<xsl:otherwise>Unknown Language</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
Практика –
проверка нескольких условий
▪ Подключить к XSLT файл winter_reading_list.xml
▪ Запустить преобразование
▪ Результат демонстрирует возможность
повторного использования XSLT с другими
файлами данных
▪схема данных должна быть одинаковой!
Практика –
повторное использование
▪ Переименовать файл xml2xml5.xslt в
xml2xml6.xslt
▪ В теге library подключить другую схему –
library_schema2.xsd
▪ В тег writer включить теги из xml2xml2А.xslt
▪ Запустить трансформацию
▪ Сохранить результат под именем Output6.xml
Практика –
сводим все воедино
<writer>
<Fname>
<xsl:value-of select="substring-before(author, ' ')"/>
</Fname>
<Lname>
<xsl:value-of select="substring-after(author, ' ')"/>
</Lname>
</writer>
Практика –
сводим все воедино
<xsl:apply-templates>
Применяет шаблон к текущему элементу или его дочернему элементу
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
Визуальное XML to XML
преобразование с MapForce
▪ Создание XSLT в MapForce
▪ Более сложные преобразования. Фильтрация
Создание XSLT в MapForce
▪ Визуальный инструмент для работы с XSLT
▪ Будем использовать «старые» примеры
▪xml2xml6.xslt
▪library_schema2.xsd
▪reading_list.xml
▪ Запустить MapForce
▪ Открыть reading_list.xml
▪ Открыть library_schema2.xsd
▪ Сопоставить элементы данных и схемы
▪ Подсказка – кнопка Auto Connect Children
▪ Переключиться на вкладку Output для просмотра
результата
Практика –
открытие файлов и элементов
▪ Выделить тег author
▪ Во вкладке Libraries выбрать функцию substring-before
▪ Соединить линиями author и Fname – чере функцию
▪ Правым кликом на функции добавить константу (пробел),
соединить с полем substr
▪ Повторить то же для функции substring-after
▪ Переключиться на вкладку Output для просмотра
результата
Практика –
извлечение частичных данных
▪ Удалить связь между lang и
language
▪ Добавить карту значений (Insert
Value-Map)
▪ Соединить атрибуты через этот
новый блок
▪ Правым щелчком открыть свойства
блока и ввести пары значений (en-
English и т.д.)
▪ Просмотреть результат и
сохранить его как Output7.xml
▪ Правым щелчком на блоке
reading_list.xml вызвать свойства
и сменить файл данных на
winter_reading_list.xml
▪ Просмотреть результат и
сохранить его как Output8.xml
▪ Сохранить рабочий файл
▪ Сгенерировать код в XSLT 1.0
Практика –
преобразование атрибутов
▪ Открыть в XMLSpy для ознакомления такие файлы:
▪ furniture.xml
▪ color_room.xml
▪ furniture2.xsd
▪ Подсказка – используйте режим таблицы (вкладка Grid)
Практика –
знакомимся с примером
MapForce умеет работать не только с XML, но и c CSV, БД, файлами Excel,
может сгенерить XSLT 1.0/2.0, XQuery, Java, C#, C++
▪ Открыть MapForce
▪ Открыть файлы furniture.xml и furniture2.xsd
▪ Связать product и product, retail_price и price
▪ profit_margin=(retail_price-cost)/cost*100
▪ добавить функции substract, divide и multiply
▪ реализовать формулу и соединить с нужными элементами
▪ Просмотреть результат и сохранить как Output9.xml
▪ Объединить все элементы формулы в один блок – пользовательскую функцию
Profit_margin
▪ Cохранить все как xml2xml9.mfd
Практика –
связь XML и XSLT
▪ Добавить файл
color_room.xml
▪ Связать color и color, room
и room
▪ Добавить фильтр
▪ Добавить функцію equal
▪ part_number и index
▪ result и bool
▪ product и node/row
▪ on-true и product (из схемы)
▪ Правым щелчком повысить
приоритет функции equal
▪ Сохранить результат как
Output10.xml
▪ Сохранить все как
xml2xml10.mfd
Практика –
добавляем еще данные
▪ C помощью функций equal и logical-and отфильтровать продукты
▪ Product_line = Boston
▪ Просмотреть результат
▪ С помощью функций less, greater и logical-and отфильтровать продукты
▪ (retail_price > 300) AND (retail_price < 400)
▪ Просмотреть результат и сохранить в файл Output11.xml
▪ Cохранить все в xml2xml11.mfd
▪ Cгенерировать XSLT 1.0 в файле MappingMapTofurniture22.xslt
Практика –
фильтрация данных
Подводим итоги
▪ Мы узнали как выполнить
XML to XML-преобразование
▪ Познакомились с XMLSpy
▪ Изучили функции, позволяющие
манипулировать данными
▪ Научились задавать преобразования
визуально в MapForce
Вопросы
и ответы

More Related Content

Similar to XSLT -2

JavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in RussianJavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in RussianMikhail Davydov
 
Msu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced XmlMsu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced Xmlolegol
 
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQAFest
 
C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.Igor Shkulipa
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 

Similar to XSLT -2 (9)

XSLT - 1
XSLT - 1XSLT - 1
XSLT - 1
 
XSLT - 6
XSLT - 6XSLT - 6
XSLT - 6
 
XSLT -5
XSLT -5 XSLT -5
XSLT -5
 
JavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in RussianJavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in Russian
 
Msu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced XmlMsu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced Xml
 
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
 
C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.
 
XSLT -7
XSLT -7XSLT -7
XSLT -7
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 

More from Alexander Babich

Актуальні курси з мого арсеналу (Бабич О.В.)
Актуальні курси з мого арсеналу (Бабич О.В.)Актуальні курси з мого арсеналу (Бабич О.В.)
Актуальні курси з мого арсеналу (Бабич О.В.)Alexander Babich
 
M365: Word, Excel, PowerPoint...
M365: Word, Excel, PowerPoint...M365: Word, Excel, PowerPoint...
M365: Word, Excel, PowerPoint...Alexander Babich
 
M365: Інші сервіси та застосунки
M365: Інші сервіси та застосункиM365: Інші сервіси та застосунки
M365: Інші сервіси та застосункиAlexander Babich
 
M365: Завершення
M365: ЗавершенняM365: Завершення
M365: ЗавершенняAlexander Babich
 
M365: рекомендації
M365: рекомендаціїM365: рекомендації
M365: рекомендаціїAlexander Babich
 
M365: Огляд платформи Microsoft365
M365: Огляд платформи Microsoft365M365: Огляд платформи Microsoft365
M365: Огляд платформи Microsoft365Alexander Babich
 
M365: Роздаткові матеріали
M365: Роздаткові матеріалиM365: Роздаткові матеріали
M365: Роздаткові матеріалиAlexander Babich
 
Meet&Code - VR, метавсесвіт та криптовалюти (1).pptx
Meet&Code - VR, метавсесвіт та криптовалюти (1).pptxMeet&Code - VR, метавсесвіт та криптовалюти (1).pptx
Meet&Code - VR, метавсесвіт та криптовалюти (1).pptxAlexander Babich
 
Ви обрали професію програміста
Ви обрали професію програмістаВи обрали професію програміста
Ви обрали професію програмістаAlexander Babich
 
Змішане навчання в ППФК
Змішане навчання в ППФКЗмішане навчання в ППФК
Змішане навчання в ППФКAlexander Babich
 
Формування професійних інтересів студентів
Формування професійних інтересів студентівФормування професійних інтересів студентів
Формування професійних інтересів студентівAlexander Babich
 
День відкритих дверей' 2021
День відкритих дверей' 2021День відкритих дверей' 2021
День відкритих дверей' 2021Alexander Babich
 
06. Обучение и сертификация по Azure
06. Обучение и сертификация по Azure06. Обучение и сертификация по Azure
06. Обучение и сертификация по AzureAlexander Babich
 
05.Внедрение Azure
05.Внедрение Azure05.Внедрение Azure
05.Внедрение AzureAlexander Babich
 
04.Службы Azure - подробнее
04.Службы Azure - подробнее04.Службы Azure - подробнее
04.Службы Azure - подробнееAlexander Babich
 
03.Сколько стоит облако
03.Сколько стоит облако03.Сколько стоит облако
03.Сколько стоит облакоAlexander Babich
 

More from Alexander Babich (20)

Актуальні курси з мого арсеналу (Бабич О.В.)
Актуальні курси з мого арсеналу (Бабич О.В.)Актуальні курси з мого арсеналу (Бабич О.В.)
Актуальні курси з мого арсеналу (Бабич О.В.)
 
M365: Word, Excel, PowerPoint...
M365: Word, Excel, PowerPoint...M365: Word, Excel, PowerPoint...
M365: Word, Excel, PowerPoint...
 
M365: Інші сервіси та застосунки
M365: Інші сервіси та застосункиM365: Інші сервіси та застосунки
M365: Інші сервіси та застосунки
 
M365: OneDrive
M365: OneDriveM365: OneDrive
M365: OneDrive
 
M365: Завершення
M365: ЗавершенняM365: Завершення
M365: Завершення
 
M365: SharePoint
M365: SharePointM365: SharePoint
M365: SharePoint
 
M365: рекомендації
M365: рекомендаціїM365: рекомендації
M365: рекомендації
 
M365: Огляд платформи Microsoft365
M365: Огляд платформи Microsoft365M365: Огляд платформи Microsoft365
M365: Огляд платформи Microsoft365
 
M365: Вступ
M365: ВступM365: Вступ
M365: Вступ
 
M365: Роздаткові матеріали
M365: Роздаткові матеріалиM365: Роздаткові матеріали
M365: Роздаткові матеріали
 
Meet&Code - VR, метавсесвіт та криптовалюти (1).pptx
Meet&Code - VR, метавсесвіт та криптовалюти (1).pptxMeet&Code - VR, метавсесвіт та криптовалюти (1).pptx
Meet&Code - VR, метавсесвіт та криптовалюти (1).pptx
 
Ви обрали професію програміста
Ви обрали професію програмістаВи обрали професію програміста
Ви обрали професію програміста
 
Змішане навчання в ППФК
Змішане навчання в ППФКЗмішане навчання в ППФК
Змішане навчання в ППФК
 
Формування професійних інтересів студентів
Формування професійних інтересів студентівФормування професійних інтересів студентів
Формування професійних інтересів студентів
 
День відкритих дверей' 2021
День відкритих дверей' 2021День відкритих дверей' 2021
День відкритих дверей' 2021
 
Спробуйте Python
Спробуйте PythonСпробуйте Python
Спробуйте Python
 
06. Обучение и сертификация по Azure
06. Обучение и сертификация по Azure06. Обучение и сертификация по Azure
06. Обучение и сертификация по Azure
 
05.Внедрение Azure
05.Внедрение Azure05.Внедрение Azure
05.Внедрение Azure
 
04.Службы Azure - подробнее
04.Службы Azure - подробнее04.Службы Azure - подробнее
04.Службы Azure - подробнее
 
03.Сколько стоит облако
03.Сколько стоит облако03.Сколько стоит облако
03.Сколько стоит облако
 

XSLT -2

  • 1. XML to XML - преобразования http://ProductivityBlog.com.ua
  • 2. О чем пойдет речь ▪ Начинаем с простого ▪ Копаем глубже ▪ Другие функции ▪ Визуальное XML to XML преобразование с MapForce ▪ Практика
  • 3. Файлы и инструменты Файлы практических работ в файле XSLT_2.zip в папке Practice XMLSpy, MapForce из пакета ALTOVA MissionKit
  • 4. Начинаем с простого ▪ <xsl:stylesheet> ▪ <xsl:output> ▪ Практика ▪ <xsl:template> ▪ <xsl:copy-of> ▪ Практика ▪ Промежуточные итоги
  • 5. <xsl:stylesheet> ▪ Таблицы стилей XSLT – это тоже XML-файлы <?xml version="1.0" encoding="UTF-8"?> ▪ Корневой элемент <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ▪<xsl:функция атрибут=“значение”>
  • 6. <xsl:output> ▪ Непосредственно вложен в корневой элемент ▪ Задает формат для выходного файла ▪ method – тип файла ▪ xml, html, text ▪ encoding – кодировка ▪ indent – отступы тегов для лучшей читабельности ▪ <xsl:output method=“xml” version=“1.0” encoding=“UTF-8” indent=“yes”/>
  • 7. Практика – создание XSLT-файла ▪Создать новый файл в XMLSpy ▪выбрать XSLT 1.0 ▪выбрать Generic XSL/XSLT Transformation ▪Сохранить файл под именем xml2xml1.xslt Готовый файл можно найти в папке Chapter2transformations
  • 8. <xsl:template> ▪ Определяет какие данные войдут в результирующий файл ▪ Чтобы взять все данные из исходного файла: <xsl:template match=“/”> </xsl:template>
  • 9. <xsl:copy-of> ▪ Копирование данных и структуры их исходного файла ▪ Xpath-функция node() копирует текущий элемент ▪в нашем случае – корневой (предыдущий слайд) <xsl:copy-of select=“node()”/>
  • 10. Практика – редактирование XSLT-файла ▪В файл xml2xml1.xslt добавить теги xsl:template и xsl:copy-of Готовый файл можно найти в папке Chapter2transformations
  • 11. Практика – преобразование из XML ▪ Открыть в XMLSpy файл reading_list.xml ▪ В меню XSL/XQuery выбрать Assign XSL ▪ Выбрать xml2xml1.xslt ▪ Отметить опцию “Make a path relative…” ▪ Запустить трансформацию (F10, меню, тулбар) ▪ Сохранить файл как Output1.xml ▪ Валидировать файл (F8, тулбар) Готовый файл можно найти в папке Chapter2transformations
  • 12. Практика – преобразование из XSLT ▪ Перейти во вкладку с файлом xml2xml1.xslt ▪Project and Entry Helpers ▪ Кликнуть на иконке XML ▪Выбрать reading_list.xml ▪ Запустить трансформацию (F10, меню, тулбар) Готовый файл можно найти в папке Chapter2transformations
  • 13. Промежуточные итоги ▪ Мы изучили структуру XSLT-файлов ▪ Научились создавать их ▪ <xsl:copy-of> позволяет просто скопировать содержимое файла ▪ Преобразование можно запустить из XML или XSLT
  • 14. Копаем глубже ▪ Файл схемы ▪ <xsl-for-each> ▪ Cтруктура элементов ▪ <xsl:attribute> ▪ <xsl:value-of> ▪ Практика
  • 15. Файл схемы ▪ XML-файлы структурируются в соответствии со схемой ▪ Пример ▪ Библиотека: каждая книга имеет название (плюс год и язык) и автора ▪Мы хотим взять данные из reading_list.xml и преобразовать в форму, соответствующую схеме библиотеки
  • 17. <xsl:for-each> ▪ Отбирает набор элементов и позволяет перебрать и обработать их один за другим ▪ Пример: <xsl:for-each select=“/reading_list/book”> <xsl:copy-of select=“author”> </xsl:for-each> Скорее всего, полученный файл не будет валидным XML-файлом. Как думаете, почему?
  • 18. Структура элементов ▪ Чтобы создать структуру в выходном файле, нужно ▪добавить имена элементов – теги ▪добавить атрибуты – xsl:attribute ▪чуть позже 
  • 20. Пример для library_schema.xsd <library> <xsl:for-each select=“/reading_list/book”> <book> <writer/> <title/> </book> </xsl:for-each> </library>
  • 21. Замечания к примерам ▪ Структура будет правильной, но пока без атрибутов ▪ select внутри xsl:for-each использует имя элемента из ИСХОДНОГО файла ▪ ОСТАЛЬНЫЕ теги соответствуют результирующей схеме
  • 23. В продолжение примера <library xsi:noNamespaceSchemaLocation= "library_schema.xsd” xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"> </library>
  • 25. <xsl:attribute> - продолжение <library xsi:noNamespaceSchemaLocation= "library_schema.xsd” xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"> <xsl:for-each select=“/reading_list/book”> <book> <writer> Name of author </writer> <title first_edition=“2011” language=“en”> Name of book </title> </book> </xsl:for-each> </library>
  • 26. <xsl:value-of> ▪ Помещает в результирующий файл данные из исходного ▪XPath-выражение в атрибуте select ▪названия – из ИСХОДНОГО файла <xsl:value-of select=“/reading_list/book[2]/title”/>
  • 27. <xsl:value-of> - пример <book> <writer> <xsl:value-of select=“author”/> </writer> <title> <xsl:attribute name=“first_edition”> <xsl:value-of select=“year”/> </xsl:attribute> <xsl:attribute name=“language”> <xsl:value-of select=“title/@lang”/> </xsl:attribute> <xsl:value-of select=“title”/> </title> </book>
  • 28. Замечания к примеру ▪ В примере – простое копирование значений ▪ Встроенные функции позволяют менять значения на лету ▪ Сравните <xsl:value-of select=“author”/> и <xsl:value-of select=“concat (‘Mr. ‘,author)”/>
  • 29. Практика – изменение структуры данных ▪ Сохранить xml2xml1.xslt под именем xml2xml2.xslt ▪ Добавить все преобразования, рассмотренные в этом уроке ▪ подсказка: <xsl:for-each select="//book"> ▪ Запустить преобразование ▪ Сохранить результат как Output2.xml ▪ Валидировать файл Готовый файл можно найти в папке Chapter2transformations
  • 30. Преобразование результатов преобразования ▪ Вместо одного сложного XSLT-файла можно выполнить цепочку простых преобразований ▪ Например, преобразовать Output2.xml в соответствии со схемой library_schema2.xsd ▪ почти то же самое ▪ имя автора разбито на два элемента – имя и фамилия ▪ функции substring-before() и substring-after() ▪ для случая когда имя не содержит пробелов и отделено пробелом от фамилии
  • 31. Практика – извлечение частичных данных ▪ Сохранить xml2xml2.xslt под именем xml2xml2А.xslt ▪ Поменять имя схемы на library_schema2.xsd ▪ Поменять теги внутри цикла для извлечения имени и фамилии автора ▪ Установить Output2.xml в качестве исходного файла ▪ Запустить преобразование ▪ Сохранить результат под именем Output2A.xml Готовый файл можно найти в папке Chapter2transformations
  • 32. <xsl:for-each select="//book"> <book> <writer> <Fname> <xsl:value-of select="substring-before(writer, ' ')" /> </Fname> <Lname> <xsl:value-of select="substring-after(writer, ' ')" /> </Lname> </writer> <xsl:copy-of select="title" /> </book> Практика – извлечение частичных данных
  • 33. Другие функции ▪ <xsl:sort> ▪ сортировка результатов ▪ <xsl:if> ▪ проверка условий ▪ <xsl:choose> ▪ <xsl:apply-templates>
  • 34. <xsl:sort> ▪ Сортировка набора элементов. часто – внутри цикла <xsl:for-each> ▪select – по какому ключу сортировать ▪ может быть несколько ▪order – порядок сортировки ▪data-type – название говорит за себя ▪ number или text (по умолчанию)
  • 35. <xsl:sort> - пример <xsl:for-each select=“//book”> <xsl:sort select=“author” order=“descending”/> <xsl:sort select=“year” data-type=“number”/> </xsl:for-each>
  • 36. ▪ Добавить в файл xml2xml2.xslt: ▪сортировку по автору в порядке убывания ▪сортировку по году издания ▪ Запустить трансформацию ▪ Сохранить файл под именем xml2xml3.xslt ▪ Сохранить результат под именем Output3.xml Практика – сортировка результатов
  • 37. <xsl:if> ▪ Изменение результирующих значений в зависимости от истинности условия ▪по сути, упрощенный условный оператор ▪ нет ветви else ▪test – условие (TRUE или FALSE)
  • 38. <xsl:if> - пример <writer> <xsl:if test=“sex=‘M’”>Mr.</xsl:if> <xsl:if test=“sex=‘F’”>Ms.</xsl:if> <xsl:value-of select=“author”/> </writer>
  • 39. ▪ Сохранить xml2xml3.xslt как xml2xml4.xslt ▪ Изменить атрибут language тега title <xsl:attribute name=“language”> <xsl:if test=“title/@lang=‘en’”>English</xsl:if> <xsl:if test=“title/@lang=‘fr’”>French</xsl:if> </xsl:attribute> ▪ Запустить трансформацію ▪ Сохранить результат как Output4.xml Практика – проверка условий
  • 40. <xsl:choose> ▪ Проверка нескольких условий – аналог оператора варіанта ▪xsl:when с атрибутом test ▪xsl:otherwise ▪ необязательно, но это хорошая практика
  • 41. <xsl:choose> - пример <xsl:choose> <xsl:when test=“sex=‘M’”>Male</xsl:when> <xsl:when test=“sex=‘F’”>Female</xsl:when> <xsl:otherwise>Unknown</xsl:otherwise> <xsl:choose>
  • 42. ▪ Удалить из файла xml2xml4.xslt элементы xsl:if ▪ Использовать xsl:choose для атрибута language тега title ▪ Сохранить файл как xml2xml5.xslt ▪ Запустить трансформацію ▪ Сохранить результат как Output5.xml Практика – проверка нескольких условий
  • 43. <xsl:attribute name="language"> <xsl:choose> <xsl:when test="title/@lang='en'">English</xsl:when> <xsl:when test="title/@lang='fr'">French</xsl:when> <xsl:when test="title/@lang='es'">Spanish</xsl:when> <xsl:otherwise>Unknown Language</xsl:otherwise> </xsl:choose> </xsl:attribute> Практика – проверка нескольких условий
  • 44. ▪ Подключить к XSLT файл winter_reading_list.xml ▪ Запустить преобразование ▪ Результат демонстрирует возможность повторного использования XSLT с другими файлами данных ▪схема данных должна быть одинаковой! Практика – повторное использование
  • 45. ▪ Переименовать файл xml2xml5.xslt в xml2xml6.xslt ▪ В теге library подключить другую схему – library_schema2.xsd ▪ В тег writer включить теги из xml2xml2А.xslt ▪ Запустить трансформацию ▪ Сохранить результат под именем Output6.xml Практика – сводим все воедино
  • 46. <writer> <Fname> <xsl:value-of select="substring-before(author, ' ')"/> </Fname> <Lname> <xsl:value-of select="substring-after(author, ' ')"/> </Lname> </writer> Практика – сводим все воедино
  • 47. <xsl:apply-templates> Применяет шаблон к текущему элементу или его дочернему элементу <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="cd"> <p> <xsl:apply-templates select="title"/> <xsl:apply-templates select="artist"/> </p> </xsl:template>
  • 48. Визуальное XML to XML преобразование с MapForce ▪ Создание XSLT в MapForce ▪ Более сложные преобразования. Фильтрация
  • 49. Создание XSLT в MapForce ▪ Визуальный инструмент для работы с XSLT ▪ Будем использовать «старые» примеры ▪xml2xml6.xslt ▪library_schema2.xsd ▪reading_list.xml
  • 50.
  • 51. ▪ Запустить MapForce ▪ Открыть reading_list.xml ▪ Открыть library_schema2.xsd ▪ Сопоставить элементы данных и схемы ▪ Подсказка – кнопка Auto Connect Children ▪ Переключиться на вкладку Output для просмотра результата Практика – открытие файлов и элементов
  • 52. ▪ Выделить тег author ▪ Во вкладке Libraries выбрать функцию substring-before ▪ Соединить линиями author и Fname – чере функцию ▪ Правым кликом на функции добавить константу (пробел), соединить с полем substr ▪ Повторить то же для функции substring-after ▪ Переключиться на вкладку Output для просмотра результата Практика – извлечение частичных данных
  • 53. ▪ Удалить связь между lang и language ▪ Добавить карту значений (Insert Value-Map) ▪ Соединить атрибуты через этот новый блок ▪ Правым щелчком открыть свойства блока и ввести пары значений (en- English и т.д.) ▪ Просмотреть результат и сохранить его как Output7.xml ▪ Правым щелчком на блоке reading_list.xml вызвать свойства и сменить файл данных на winter_reading_list.xml ▪ Просмотреть результат и сохранить его как Output8.xml ▪ Сохранить рабочий файл ▪ Сгенерировать код в XSLT 1.0 Практика – преобразование атрибутов
  • 54. ▪ Открыть в XMLSpy для ознакомления такие файлы: ▪ furniture.xml ▪ color_room.xml ▪ furniture2.xsd ▪ Подсказка – используйте режим таблицы (вкладка Grid) Практика – знакомимся с примером MapForce умеет работать не только с XML, но и c CSV, БД, файлами Excel, может сгенерить XSLT 1.0/2.0, XQuery, Java, C#, C++
  • 55. ▪ Открыть MapForce ▪ Открыть файлы furniture.xml и furniture2.xsd ▪ Связать product и product, retail_price и price ▪ profit_margin=(retail_price-cost)/cost*100 ▪ добавить функции substract, divide и multiply ▪ реализовать формулу и соединить с нужными элементами ▪ Просмотреть результат и сохранить как Output9.xml ▪ Объединить все элементы формулы в один блок – пользовательскую функцию Profit_margin ▪ Cохранить все как xml2xml9.mfd Практика – связь XML и XSLT
  • 56. ▪ Добавить файл color_room.xml ▪ Связать color и color, room и room ▪ Добавить фильтр ▪ Добавить функцію equal ▪ part_number и index ▪ result и bool ▪ product и node/row ▪ on-true и product (из схемы) ▪ Правым щелчком повысить приоритет функции equal ▪ Сохранить результат как Output10.xml ▪ Сохранить все как xml2xml10.mfd Практика – добавляем еще данные
  • 57. ▪ C помощью функций equal и logical-and отфильтровать продукты ▪ Product_line = Boston ▪ Просмотреть результат ▪ С помощью функций less, greater и logical-and отфильтровать продукты ▪ (retail_price > 300) AND (retail_price < 400) ▪ Просмотреть результат и сохранить в файл Output11.xml ▪ Cохранить все в xml2xml11.mfd ▪ Cгенерировать XSLT 1.0 в файле MappingMapTofurniture22.xslt Практика – фильтрация данных
  • 58. Подводим итоги ▪ Мы узнали как выполнить XML to XML-преобразование ▪ Познакомились с XMLSpy ▪ Изучили функции, позволяющие манипулировать данными ▪ Научились задавать преобразования визуально в MapForce

Editor's Notes

  1. The correct way to declare an XSL style sheet according to the W3C XSLT Recommendation is: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> or: <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2. В результирующем файле не будет данных из исходного, но это будет валидный XML
  3. Результат содержит имена, фамилии, названия языков и сортировку
  4. Результат содержит имена, фамилии, названия языков и сортировку
  5. Пока в результирующем файле нет значения автора