logo
metoda / Metod_sam_IT_ta_tehnol_Internet_2010_ukr

4.5.2 Шаблони xslt

XSLT-документ – це XML-документ із кореневим елементом stylesheet. Простором імен для XSLT-документа є http://www.w3.org/1999/XSL/Transform. При перетворенні XSL використовується два дерева. Перше дерево – вихідне. Його вузли відповідають вузлам вихідного XML-документа, що піддається перетворенню. Друге дерево є результатом перетворення. Воно містить вузли, отримані в процесі XSL-перетворення, і є документом, отриманим після перетворення.

Розглянемо перетворення наступного XML-документа в звичайний HTML-документ за допомогою XSLT:

<?xml version = “1.0” ?>

<myMessage>

<message>Welcome to XSLT!</message>

</myMessage>

Створюємо простий XSLT-документ, що містить шаблон для вирішення завдання:

<?xml version = “1.0”?>

<xsl:stylesheet version = “1.0” xmlns:xsl =

“http://www.w3.org/1999/XSL/Transform”>

<xsl:template match = “myMessage”>

<html>

<body><xsl:value-of select = “message”/> </body>

</html>

</xsl:template>

</xsl:stylesheet>

Рядок <xsl:stylesheet version = “1.0” xmlns:xsl =

http://www.w3.org/1999/XSL/Transform”> містить кореневий елемент XSLT-документа xsl:stylesheet та його атрибути. Атрибут version визначає версію XSLT, що використовується. Визначено префікс простору імен xsl, якому призначений уніфікований ідентифікатор ресурсу “http://www.w3.org/1999/XSL/Transform”.

Рядок <xsl:template match = “myMessage”> містить елемент шаблона template. Цей елемент зіставляє певний вузол XML-документа, використовуючи вираз XPath, заданий в атрибуті match. У цьому випадку зіставляється будь-який елемент myMessage. Рядки

<html>

<body><xsl:value-of select = “message”/></body>

</html>

є вмістом елемента template. Коли у вихідному дереві зустрічається елемент myMessage, в результуюче дерево поміщається вміст елемента template. За допомогою атрибута select елемента value-of і виразу XPath текстовий вміст набору вузлів, повернутий виразом XPath, поміщається в результуюче дерево.

Для виконання перетворення необхідно підключити створений XSLT-документ до вхідного XML-документа:

<?xml version = “1.0” ?>

<?xml:stylesheet type = “text/xsl” href = “intro.xsl”?>

<myMessage>

<message>Welcome to XSLT!</message>

</myMessage>

У рядку <?xml:stylesheet type = “text/xsl” href = “intro.xsl”?> елемент stylesheet використовується для приєднання створеної таблиці стилів до XML-документа. Атрибут type визначає тип файла, що приєднується. Можливі лише два значення: text/xsl, що визначає XSL-документ, і text/css, що визначає CSS-документ. Атрибут href містить уніфікований ідентифікатор ресурсу для файла, що приєднується. Результат перетворення можна побачити на рис. 4.3.

Рисунок 4.3 – Internet Explorer відображує результат XSLT-перетворення

4.5.3 Створення елементів і атрибутів

Розглянемо наступний приклад. XML-документ потрібно перетворити в інший XML-документ.

<?xml version = "1.0"?>

<sports>

<game title = "cricket">

<id>243</id>

<para>

More popular among commonwealth nations.

</para>

</game>

<game title = "baseball">

<id>431</id>

<para>

More popular in America.

</para>

</game>

<game title = "soccer">

<id>123</id>

<para>

Most popular sport in the world.

</para>

</game>

</sports>

Це можна зробити за допомогою такого XSLT-документа:

<?xml version = "1.0"?>

<xsl:stylesheet version = "1.0"

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

<xsl:template match = "/">

<xsl:apply-templates/>

</xsl:template>

<xsl:template match = "sports">

<sports>

<xsl:apply-templates/>

</sports>

</xsl:template>

<xsl:template match = "game">

<xsl:element name = "{@title}">

<xsl:attribute name = "id">

<xsl:value-of select = "id"/>

</xsl:attribute>

<comment>

<xsl:value-of select = "para"/>

</comment>

</xsl:element>

</xsl:template>

</xsl:stylesheet>

В рядках

<xsl:template match = “/”>

<xsl: apply-templates/>

</xsl:template>

атрибут match використовується для виділення кореневого елемента XML-документа. “/” зіставляється з кореневим елементом XML-документа. Елемент apply-templates використовується для застосування шаблона XSLT-документа до певних вузлів XML-документа. За замовчуванням елемент apply-templates зіставляє шаблону всі дочірні вузли елемента.

Рядки

<xsl:template match = "sports">

<sports>

<xsl:apply-templates/>

</sports>

</xsl:template>

зіставляються з елементом sports, який виводиться. Ми виводимо елемент sports, після чого шаблон застосовується до всіх дочірніх вузлів елемента sports.

Рядок <xsl:element name = “{@title}”> використовується для створення елемента з ім'ям, визначеним в атрибуті name.

Наступні рядки створюють атрибут:

<xsl:attribute name = “id”>

<xsl: value-of select = “id”/>

</xsl:attribute>

Елемент attribute може міститись лише всередині елемента element. Атрибут name визначає ім'я атрибута. Результатом буде створення атрибута id для нового елемента.

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

<?xml version = "1.0"?>

<sports>

<cricket id="243">

<comment>

More popular among commonwealth nations.

</comment>

</cricket>

<baseball id="431">

<comment>

More popular in America.

</comment>

</baseball>

<soccer id="123">

<comment>

Most popular sport in the world.

</comment>

</game>

</sports>

4.5.4 Обхід набору вузлів і впорядкування

XSLT дозволяє обходити набір вузлів і впорядковувати вузли.

Елемент for-each застосовує вміст елемента до кожного вузла, який зіставляється зі значенням атрибута select. Наприклад, у рядку

<xsl: for-each select = “group/student”>

зіставлення здійснюється з усіма елементами student елемента group.

Рядок <xsl:sort select = “@num” order = “ascending”/>

визначає елемент sort, що впорядковує вузли, обрані елементом for-each за значенням атрибута select у порядку, заданому значенням атрибута order. Атрибут order може приймати значення ascending (за зростанням) і descending (за убуванням). У цьому прикладі відбувається впорядкування вузлів за значенням атрибута num за зростанням.

4.5.5 Умовна обробка

XSLT дозволяє також виконувати умовну обробку, використовуючи умовні вирази.

Елемент choose використовується для множинного вибору і може мати дочірні елементи when і otherwise.

Наприклад, у рядках

<xsl:choose>

<xsl:when test = “@time > '0700' and @time < '1200'”>

Ранок (<xsl: value-of select = “@time”/>) :

</xsl:when>

<xsl:otherwise>

Весь день:

</xsl:otherwise>

</xsl:choose>

є умова when в елементі choose. Атрибут test містить умову, яка підлягає перевірці (у цьому випадку час із 7 до 12). Перевірка в елементі when завершується після одержання першого значення true. Елемент otherwise є необов'язковим, але якщо є, то має бути єдиним, і розташовуватися після всіх елементів when. Цей елемент застосовується, якщо жодна з умов в елементах when не буде правдивою.

Для однократної перевірки умови використовується оператор if, наприклад:

<xsl:if test = “error”>

Помилка!!!

</xsl:if>

4.5.6 Змінні в XSLT

Для обробки інформації XSLT дозволяє використовувати змінні. У наступному прикладі

<xsl:variable name = “totalpages”

select = “sum(book/chapters/*/@pages)”/>

створюється елемент variable з атрибутом name, рівним totalpages, для зберігання числа сторінок у книзі. Атрибут select має значення sum(book/chapters/*/@pages), що є виразом, який підсумовує значення атрибута pages елемента chapters. Для виведення значення змінної totalpages використовується елемент value-of:

<xsl: value-of select = “$totalpages”/>.

Знак $ вказує на те, що використовується посилання на змінну. Елемент value-of може також використовувати значення елементів і атрибутів.