Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Палагута.doc
Скачиваний:
10
Добавлен:
13.11.2019
Размер:
6.6 Mб
Скачать

11.2. Розширювана мова стилів для перетворень xslt

Мова XSLT (від. англ. eXtensible Stylesheet Language for Transformations розширювана мова стилів для перетворень) надає можливість перетворювати XML – документи у інші формати, наприклад у формат HTML, RTF тощо.

Для того, щоб підключити таблицю XSLT до XML – документа після оголошення документа слід визначити команду обробки stylesheet, у якій задається тип файлу type="text/xsl" і власно файл перетворень href="ім’я_файлу". Така команда може виглядати так:

<?xml-stylesheet type="text/xsl" href="tableST.xsl" ?>

Файл XSLT – це правильно оформлений XML – документ, що вміщує набір шаблонних правил, за допомогою яких з частин вхідного документа генеруються відповідні частини вихідного документа.

Важливим є те, що файл стилів повинен бути правильно оформленим XML – документом, тому якщо дані перетворюються у HTML – документ і застосовуються теги мови HTML слід пам’ятати, що обов’язковою є наявність закриваючого тегу, значення атрибутів слід заключати у лапки, а також те, що мова XML є регістрозалежною.

Файл XSLT має таку структуру:

оголошення XML – документа;

елемент stylesheet, який оголошує таблицю стилів;

шаблон, за яким будується результатний документ;

шаблон [шаблони], за якими обробляються данні вхідного документа.

Оголошення XML – документа у файлі XSLT не відрізняється від оголошення звичайного у XML – документі, може бути, наприклад, таким:

<?xml version="1.0" encoding="UTF-8"?>

Елемент stylesheet (іноді використовується синонім transform) визначає, що далі в документі знаходиться таблиця стилів. Атрибут version вказує на версію мови XSLT, на теперішній час більш розповсюдженою є версія 1.0, однак вже прийнято рекомендацію по версії 2.0. У елементі stylesheet також потрібно обов’язково визначити простір імен. Простір імен XSLT має URI http://www.w3.org/1999/XSL/Transform. Будь-який інший URI у оголошенні простору імен ідентифікує елементи як такі, що не належать до XSLT, тому змінювати URI не можна. Для елементів XSLT можна застосовувати будь-який префікс. Оскільки найчастіше на практиці використовується префікс xsl, ми також будемо його застосовувати. Таким чином, оголошення таблиці стилів може виглядати так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

При визначені шаблонів найчастіше використовується такі елементи:

  • елемент <xsl:template>;

  • елемент <xsl:apply-templates>;

  • елемент <xsl:value-of>.

Елемент <xsl:template> визначає у перетворенні шаблонне правило (або просто шаблон) за допомогою якого вхідний документ перетворюється в результатний. Власно таблиця стилів є сукупністю таких шаблонів, тому елемент <xsl:template> завжди мусить бути елементом нижчого рівня по відношенню до елемента <xsl:stylesheet> і елементом верхнього рівня по відношенню до всіх інших елементів. Атрибут match визначає фрагмент дерева вузлів, до якого застосовується певний шаблон. Фрагмент дерева вузлів XML - документа визначається з використанням моделі XPath. Елемент <xsl:template> може також мати атрибути name і mode – визначає режим шаблонного правила, що дає змогу до однакових фрагментів дерева вузлів документа застосовувати різні правила.

Приклади застосування елемента <xsl:template>:

<xsl:template match="/"> - шаблон буде застосовано для всього дерева вузлів документа (починаючи з кореневого елемента), тобто всі вузли дерева вхідного документа поміщаються у результатне дерево

<xsl:template match="//student"> - шаблон буде застосовано для всього дерева вузлів документа, починаючи з елемента student

Елемент <xsl:apply-templates> застосовує шаблонне правило до вузлів, що повертаються XPath – виразом, визначеним у атрибуті select. Якщо атрибут select не визначено, то шаблон застосовується до всіх дочірніх елементів поточного вузла. Атрибут mode використовується для визначення режиму виклику шаблонного правила.

Приклад застосування елемента <xsl:apply-templates>:

<xsl:apply-templates select="//student" /> - шаблон застосовується до вузлів результатного дерева student

Елемент <xsl:value-of> обирає текст у вхідному документі, перетворює його і передає в результатний документ. Для вибору певного значення використовується вираз XPath, який є значенням атрибуту select.

Приклади застосування елемента <xsl:value-of >:

<xsl:value-of select="first_name" /> - виводить значення елемента first_name

<xsl:value-of select="@title" /> - виводить значення атрибуту title

<xsl:value-of select="count(//student)" /> - виводить кількість елементів student

Застосування мови XSLT для перетворення XML – документа на HTML – документ розглядається на прикладі роботи з документом, який уміщує відомості про двох студентів:

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="tableST.xsl" ?>

<students>

<student>

<name><first_name>Іван</first_name>

<last_name>Петренко</last_name></name>

<birthday>8 грудня 1990 року</birthday></student>

<student>

<name><first_name>Марія</first_name>

<last_name>Смірнова</last_name></name>

<birthday>20 липня 1989 року</birthday></student>

</students>

За допомогою програми Блокнот створено файл tableST.xsl у тій же папці, у якій міститься XML – документ:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">

<html>

<body>

<h2>Інформація про студентів</h2> <br/>

<h3>Кількість студентів:

<xsl:value-of select="count(//student)" /></h3>

<table border="1" width="90%">

<tr style="background:silver;color:blue;text-align:center;font-size:16pt">

<td> Студент </td>

<td>Дата народження</td>

</tr>

<xsl:apply-templates select="//student" />

</table>

</body>

</html>

</xsl:template>

<xsl:template match="student">

<tr style="color:blue;text-align:center;font-size:16pt">

<td> <xsl:value-of select="name" /> </td>

<td> <xsl:value-of select="birthday" /> </td>

</tr>

<br/>

</xsl:template>

</xsl:stylesheet>

Рисунок 11.2 - XML - документ з підключеною XSLT-таблицею

Якщо розчинити файл simpledoc.xml у браузері IE, то він буде виглядати так, як наведено на рис. 11.2. Як бачимо ІЕ, виводить результат перетворення XML – документа, у прикладі буде виведено HTML – документ. При виконанні команди меню Просмотр HTML - кода програми ІЕ буде виведено вхідний документ – власно XML – документ. Для перегляду коду вихідного документа доцільно встановити на комп’ютер плагін iexmltls (plugin – програмний модуль, що розширює базові можливості прикладної програми, у даному випадку програми ІЕ). Після встановлення програми iexmltls у контекстному меню вікна браузера з’являється команда View XSL Output, за допомогою якої можна вивести код вихідного документа (рис. 11.3).

Рисунок 11.3 – Код вихідного документа – результату перетворень із застосуванням XSLT - таблиці

Елемент <xsl:if>

Елемент <xsl:if> виконує перевірку істинності деякої логічної умови – значення атрибуту test, яке є XPath – виразом. Якщо умова є істинною, то виконується певний шаблон, якщо ні – у результатне дерево нічого не потрапляє. Елемент <xsl:if> виконує ті ж задачі, що ї скорочена форма оператору If у алгоритмічних процедурних мовах програмування.

Як приклад застосування елемента <xsl:if> можна розглянути створення на основі XML – документа Firms.xsl HTML – документа, у якому виводиться інформація про найбільші підприємства району. Найбільшими вважаються ті підприємства, прибуток яких перевищує 1000 од. (тис. грн.) і на яких працює більше 150 чоловік. XSLT – файл для подібного перетворення виглядає так:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">

<html>

<body>

<h2>Інформація про найбільші підприємства -//- району м.Донецька

</h2> <br/>

<table border="1" width="90%">

<tr style="background:silver;text-align:center;font-size:16pt">

<td> Найменування </td>

<td>Прибуток</td>

<td> Кількість працюючих </td>

</tr>

<xsl:apply-templates select="//firm" />

</table>

</body>

</html>

</xsl:template>

<xsl:template match="firm">

<xsl:if test="(profit>1000) and (number_of_the_working>150)">

<tr style="text-align:center;font-size:16pt">

<td> <xsl:value-of select="@title" /> </td>

<td> <xsl:value-of select="profit" /> </td>

<td> <xsl:value-of select="number_of_the_working" /> </td>

</tr>

</xsl:if>

</xsl:template>

</xsl:stylesheet>

Документ, що отримано, подано на рис. 11.4.

Рисунок 11.4 - HTML - документ, отриманий за допомогою XSLT

із використанням елементу <xsl:if>

Елемент <xsl:choose>

Елемент <xsl:choose> дозволяє організувати розгалужений процес одразу по багатьом напрямкам. Елемент <xsl:choose> вміщує декілька елементів <xsl:when>, а також може включати необов’язковий елемент <xsl:otherwise>. При обробці елемента <xsl:choose> XSLT – процесор обчислює по черзі значення виразів, які визначено в атрибутах test елементів <xsl:when>. Якщо вираз має значення true (істина), то виконується вміст елемента <xsl:when> і елемент <xsl:choose> зачиняється (тобто буде виконано лише перший елемент <xsl:when>, умова якого є вірною). Якщо всі умови елементі <xsl:when> не вірні, то виконується вміст елемента <xsl:otherwise>.

Як приклад застосування елемента <xsl:choose> розглядається XSLT – документ, за допомогою якого із файлу Firms.xsl обираються і видаються у вигляді таблиці данні: найменування підприємства, дохід, видатки. У таблиці виводу данні про підприємства, дохід яких складає більше 1000 од. (тис. грн.) виводяться на жовтому тлі, менше – на фоні кольору хакі. XSLT – документ може виглядати так:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">

<html>

<body>

<h2>Інформація про підприємства -//- району м.Донецька </h2> <br/>

<table border="1" width="90%">

<tr style="background:silver;text-align:center;font-size:16pt">

<td> Найменування </td>

<td> Адреса </td>

<td>Дохід</td>

<td>Видатки</td>

</tr>

<xsl:apply-templates select="//firm" />

</table>

</body>

</html>

</xsl:template>

<xsl:template match="firm">

<xsl:choose>

<xsl:when test="income > 1000">

<tr style="background:yellow;text-align:center;font-size:16pt">

<td> <xsl:value-of select="@title" /> </td>

<td> <xsl:value-of select="address" /> </td>

<td> <xsl:value-of select="income" /> </td>

<td> <xsl:value-of select="expenses" /> </td>

</tr>

</xsl:when>

<xsl:when test="income < 1000">

<tr style="background:olive;text-align:center;font-size:16pt">

<td> <xsl:value-of select="@title" /> </td>

<td> <xsl:value-of select="address" /> </td>

<td> <xsl:value-of select="income" /> </td>

<td> <xsl:value-of select="expenses" /> </td>

</tr>

</xsl:when>

</xsl:choose>

</xsl:template>

</xsl:stylesheet>

Для оптимізації коду можна застосовувати іменовані шаблони і елемент <xsl:call-template> або елемент <xsl:attribute>, який дає змогу створювати вузли атрибутів.

Результат застосування даної таблиці стилів наведено на рис.11.5.

Рисунок11.5 - HTML - документ, отриманий за допомогою XSLT із використанням елементу <xsl:choose>

Елемент <xsl:for-each>

Елемент <xsl:for-each> дозволяє обробити усі вузли множини за допомогою певних команд XSLT, які знаходяться всередині контейнера. Тобто для кожного вузла (for each) виконати певні дії. Обов’язковий атрибут select визначає вираз XPath, результатом обчислення якого є певна множина вузлів. Елемент <xsl:for-each> використовується для ітерації по множині вузлів і створення певного виводу для кожного вузла.

Як приклад використання елементу <xsl:for-each> розглядається створення HTML – документа, у якому розташовано список підприємств (елементи firm) із файлу Firms.xsl. Код таблиці стилів може виглядати так:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">

<html>

<body style="background:gainsboro;color:indigo;font-size:16pt">

<h2>Перелік підприємств -//- району м.Донецька </h2> <br/>

<ol>

<xsl:for-each select="//firm">

<li> <xsl:value-of select="@title" /> </li>

</xsl:for-each>

</ol>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

У результаті застосування даної таблиці стилів для перетворення документа Firms.xsl буде отримано HTML – документ, що надано на рис.11.6.

Рисунок 11.6 - HTML - документ, отриманий за допомогою XSLT із використанням елементу <xsl:for-each>

Як бачимо, елемент <xsl:for-each> має більш обмежені можливості в порівнянні з операторами циклів у алгоритмічних мовах програмування. Власно, того ж самого результату можна було досягти за допомогою створення шаблону для обробки усіх вузлів дерева з ім’ям firm.

Контрольні питання

  1. Для чого використовується мова XPath?

  2. Як будується вираз XPath?

  3. Що таке вісь? Які вісі Вам відомі?

  4. Які задачі вирішує мова XSLT?

  5. Яку структуру має файл XSLT?

  6. Що таке шаблон? Як він створюється?

  7. Які елементи використовуються для застосування шаблонних правил?

  8. Що таке плагін? Яку функцію виконує плагін iexmltls?

  9. Як організувати розгалужений процес?

  10. Як обробити усі вузли певної множини?

Практичні завдання

Варіант №1

Створити і підключити до XML – документа Banks.xml таблицю стилів XSLT, за допомогою якої інформація документа виводиться у вигляді таблиці. Включити у вихідний документ відомості лише про банки, кількість працюючих яких перевищує 60 чол.

Варіант №2

Створити і підключити до XML – документа Trade.xml таблицю стилів XSLT, за допомогою якої інформація документа виводиться у вигляді таблиці. Включити у вихідний документ відомості лише про ті підприємства торгівлі, товарообіг яких перевищує 2000 од.

Варіант №3

Створити і підключити до XML – документа Sales.xml таблицю стилів XSLT, за допомогою якої інформація документа виводиться у вигляді таблиці. Включити у вихідний документ відомості лише про ті товари, по яких план продажу виконано або перевиконано.