Працюємо з XSLT

XSLT (від англ. eXtensible Stylesheet Language for Transformations - Розширювана Мова Стилів для Перетворень) використовується, здебільшого, для перетворення даних з форматуXML у форматHTML. Однак, XSLT може використовуватися для перетворення з XML (або будь-якого іншого формату, що використовує простір імен xml, подібно до RDF) у будь-який інший формат, навіть у простий текст.

Консорціум W3 визначає три складові мови мови XSL (від англ. eXtensible Stylesheet Language - Розширювана Мова Стилів):XSLT, XPath (мова шляхів і виразів, що використовується в XSLT для доступу до окремих частин XML-документа) іXSL Formatting Objects - словник, що визначає семантику форматування документів.

Зустрічаємо XSLT

Насамперед слід зазначити, що наш документ використовує стилістику XML та імпортувати простір імен XML:

Далі, основним елементом, який ми використовуватимемо, є xsl:template match . Цей елемент викликається щоразу, коли ім'я xml-вузла збігається зі значенням атрибуту xsl:template match :

Всередині елемента xsl:template match слід зазначити вкладені вузли елементом: xsl:value-of select . Давайте спочатку створимо xml-документ, що містить деяку інформацію:

Так має виглядати xslt-перетворення, яке виймає вузол text з кореневого елемента (hello):

В результаті вийде наступний HTML-документ:

Отримання значень атрибутів

конструкція @att повертає значення атрибуту att. Наприклад:

Якщо ви плануєте використовувати атрибут color для виведення тексту Hello World! відповідним кольором, зробити це можна двома способами: створити змінну і використовувати її для завдання кольору шрифту або скористатися елементом xsl:attribute .

Змінні

Змінні XSLT відрізняється від змінних у звичайних мовах програмування через те, що їх значення не можуть змінюватися. Після того, як змінній присвоєно якесь значення, воно залишається постійним.

(Дивно, чому пермінні названі змінними, а не константами.Прим.ред.)

Визначаються змінні просто:

Змінною можна присвоїти значення вузла або значення атрибута вузла:

Вихідний XML-документ (я не став супроводжувати статтю своїми фотографіями, щоб не налякати вас :-) )

Як ви могли помітити, елемент був викликаний тричі, це сталося тому, що кожного разу, коли xslt виявляє елемент, що збігається з xsl:apply-templates, він викликає відповідний xsl:template match.

Отже! Вам не терпиться вивести текст червоним кольором? Спробуйте зробити це за допомогою змінних, якщо не вийде, можете заглянути в приклад hello_style_variables.xsl

Сортування

Сортування XML-тегів у XSLT виконується за допомогою елемента Цей елемент повинен розміщуватися всередині xsl:apply-templates (сортування може проводитися так само і в елементі xsl:for-eachприм. перев. ). Сортування може виконуватися як за самими xml-тегами, так і за їх атрибутами, порядок сортування можна задавати за зростанням або за спаданням (якщо символи нижнього регістру повинні передувати символам верхнього регістру або навпаки).

Для демонстрації сортування я використав приклад альбому з фотографіями, до якого додав елемент :

Тут змінено порядок проходження фотографій у вихідному html-документі. Тепер xslt спочатку впорядкує всі елементи photo з xml-файлу, а потім передасть їх елементу template-match , тому xsl:sort повинен знаходитися всередині елемента xsl:apply-templates .

Файли xsl таhtml приклад ви можете взяти тут:

Інструкція if

Якщо атрибуту PDF документа присвоєно значення "yes", як показано в прикладі:

  • documents.xml. Інформація про документи
  • documents.xsl. XSLT-перетворення
  • documents.html. Вихідний документ у форматі HTML

Інструкція for-each

І вивести кожне ім'я в окремому рядку за допомогою xsl:apply-templates і xsl:template match , але те саме можна зробити і за допомогою інструкції xsl:for-each .

Інструкція choose

Останній xslt-елемент, який я хочу вам продемонструвати, це choose елемент. Він дуже схожий на інструкцію switch мови програмування C.

Першим повинен йти елемент xsl:choose , а за ним додаткові (один або декілька) елементи xsl:when , якщо потрібно обробляти значення не підпадає під жодну з умов наявних елементів xsl:when , то ви можете додати елемент xsl:otherwise :

Функція position() повертає порядковий номер оброблюваного елемента, у разі -- документа. У цьому прикладі нас цікавить лише парність порядкового номера, тим самим ми отримуємо можливість виділяти парні та непарні рядки таблиці різним кольором. Я помістив елемент xsl:otherwise виключно з демонстраційною метою, фактично ж ви ніколи не побачите рядок з білим тлом у нашій таблиці.

Якщо ви запитаєте мене навіщо я вставив секцію CDATA, то я вам відповім, якби я цього не зробив, то XSLT-процесор генерував би повідомлення про помилку з приводу відсутності тега, що закриває (

Процесори XSLT

Процесор Saxon написаний мовою Java, користуюся версією 6.5.2. Всі наступні інструкції стосуються цієї версії, якщо у вас інша версія, то вам слід звернутися до документації для вашоїверсії за отриманням інформації щодо встановлення та запуску процесора.

Після того, як ви завантажите архів з процесором saxon вам потрібно розпакувати його:

Потім, вам потрібно додати файл saxon.jar до шляху пошуку класів, шлях до jar-архіву можна передати за допомогою ключа -cp path (можна додати шлях до jar-файлу в змінну оточення CLASSPATHприм. перев. ) . Я помістив файл saxon.jar у каталог xslt, крім того, необхідно передати Java використовуваний клас, у випадку Saxon 6.5.2 використовується клас com.icl.saxon.StyleSheet і потім повинні слідувати xml-документ і xsl-файл, наприклад:

Ця команда надішле результат роботи процесора на пристрій стандартного виведення (STDOUT), перенаправити висновок у файл можна так:

Наприклад, ми можемо перетворити наш перший приклад XSLT за допомогою процесора saxon:

Процесор xsltproc включений до складу більшості дистрибутивів, синтаксис виклику схожий виклик процесора saxon:

Я знаю про існування інших процесорів, таких як sablotron, але я ними не користувався, а тому не можу рекомендувати їх вам ;-).

Я закінчую навчання на ступінь бакалавра BUAP в Пуебло (Puebla), Мексика. Беру участь у роботі проекту TLPD-ES (іспанський варіант The Linux Documentation Projectприм. перекл. ) всі мої знання про ці технології я придбав тут. На даний момент я вивчаю Web-семантику.