Мова XML

У попередньому розділі для виведення елементів XML-документа на екран броузера ми застосовували Java Script-сценарії.

Стильовими таблицями (стильовими листами) прийнято називати спеціальні інструкції, що керують процесом відображення елемента у вікні програми-клієнта (наприклад, у вікні броузера). Запропоновані як рекомендація W3C, каскадні стильові таблиці (CSS-Cascading Style Sheets [7]) вже більше року використовуються Web-розробниками для оформлення Web-сторінок. Підтримка CSS найбільш відомими на сьогоднішній день броузерами Netscape Navigator (починаючи з версії 4.0) та Microsoft Explorer (починаючи з версії 3.0) дозволила використовувати стильові таблиці для вирішення найширшого спектра завдань - від оформлення домашньої сторінки до створення великого корпоративного Web-вузла. Слово каскадні у CSS означає можливість об'єднання окремих елементів форматування шляхом вкладених описів стилю. Наприклад, атрибути тексту, задані в тезі , будуть поширюватися на вкладені теги, доки в них не зустрінуться стильові описи, які скасовують або доповнюють поточні параметри. Таким чином, використання таблиць CSS в HTML було дуже ефективно - відпадала необхідність явного завдання форматів тегів для кожного з елементів документа.

Будучи дуже потужним засобом оформлення HTML сторінок, CSS таблиці, проте, що неспроможні застосовуватися в XML-документах, т.к. набір тегів у цій мові не обмежений і використання статичних посилань на об'єкти документа, що форматуються, у цьому випадку неможливо.

Тому для форматування XML- елементів був розроблений новиймова розмітки, що є підмножиною XML, і спеціально була призначена для форматування XML-елементів.

Деякі його відхилення від CSS: По-перше, стильові таблиці XSL дозволяють визначати оформлення елемента залежно з його розташування всередині документа, тобто. до двох елементів з однаковою назвою можуть застосовуватись різні правила форматування. По-друге, мовою, що лежить в основі XSL, є XML, а це означає, що XSL гнучкіший, універсальніший і у розробників з'являється можливість використання засобу для контролю за коректністю складання таких стильових списків (використовуючи DTD або схеми даних) По-третє, таблиці XSL є каскадними, подібно CSS, т.к. надзвичайно складно забезпечити "каскадируемость" стильових описів, або, іншими словами, можливість об'єднання окремих елементів форматування шляхом вкладених описів стилю, у ситуації, коли структура вихідного документа заздалегідь невідома і створюється в процесі самого розбору. Однак у XSL існує можливість задавати правила для стилів, за допомогою яких можна змінювати властивості стильового оформлення, що дозволяє використовувати досить складні методи форматування

В даний момент мова XSL знаходиться на стадії розробки в W3C [3] і в майбутньому, мабуть, стане частиною стандарту XML. Це означає, що використання цього механізму є найбільш перспективним способом оформлення документів XML. У поточному робочому варіанті W3C, XSL розглядається як як мову розмітки, визначальний стильові таблиці - у нього закладено кошти, необхідних виконання дій з фільтрації інформації, виведеної у вікно клієнта, пошуку елементів, складного пошуку, заснованого залежностях між елементами тощо. буд. На сьогоднішній день єдинимброузером, який підтримує деякі з цих можливостей, є бета-версія Internet Explorer 5.0, проте в найближчому майбутньому, безумовно, XSL буде використовуватися також широко, як сьогодні стандартні HTML-теги

У цьому розділі ми розглянемо спрощену об'єктну модель XSL-документа, яка використовується в поточній версії XSL-конвертора Microsoft msxsl, і тому інформацію, викладену далі, не можна вважати описом стандарту мови.

Всі приклади, наведені далі, можуть бути перевірені за допомогою XSL-конвертора, вільно доступного на сторінці Mcrosoft [www.microsoft.com/xml/xsl/]

Принцип обробки XML-документів стильовими таблицями полягає в наступному: при розборі XSL-документа програма-аналізатор обробляє інструкції цієї мови і кожному елементу, знайденому в XML-дереві, ставить у відповідність набір тегів, що визначають форматування цього елемента. Іншими словами, ми задаємо шаблон форматування для XML-елементів, причому сам цей шаблон може мати структуру відповідного фрагмента XML-документа. Інструкції XSL визначають точне розташування елемента XML у дереві, тому існує можливість застосовувати різні стилі оформлення до однакових елементів, залежно від контексту їх використання.

Структура XSL-таблиць

Розглянемо основні структурні елементи XSL, використовувані, зокрема, у конверторі msxsl, створення оформлення XML-документів.

XSL-документ являє собою сукупність правил побудови, кожне з яких виділено в окремий блок, обмежений тегами та . Правила визначають шаблони, якими кожному елементу XML ставиться у відповідність послідовність HTML- тегов, тобто. всередині них містяться інструкції, що визначають елементи XML-документа та теги форматування,застосовувані до них.

Елементи XML, до яких застосовуватиметься форматування, позначаються в XSL дескриптором ;. Для вказівки елемента з конкретною назвою (назва елемента визначається тэгами, що його позначають), тобто. Для визначення класу елемента можна використовувати атрибут type =" "

Ось приклад найпростішого XSL-документа, що визначає форматування для фрагмента rose:

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

Інструкція свідчить про те, що це правило визначає елемент. Параметром type="flower" задається назва XML-елемента, для якого використовуватиметься це правило. Програма-конвертор використовуватиме HTML-теги, розміщені всередині блоку для форматування XML-елемента, якому "призначався" поточний блок. У тому випадку, якщо для якогось елемента XML шаблон не визначається, у вихідний документ будуть додані стандартні теги форматування (наприклад,

Процес аналізу XSL-правил є рекурсивним, тобто. якщо елемент має дочірні елементи, то програма буде шукати визначення цих елементів, розташованих "глибше" у дереві документа. Вказівкою на те, що необхідно повторити процес розбору документа XML, тепер уже для дочірніх елементів, є інструкція . Дійшовши до неї, аналізатор вибере з ієрархічного дерева XML- елементів потрібну гілку і знайде в XSL-шаблонах правила, що визначають форматування цих елементів. У тому випадку, якщо замість мивкажемо інструкцію;, програма закінчить рух по цій галузі і повернеться назад, до батьківського правила. У цьому поточне правило жодної інформації у вихідному HTML-документі змінювати нічого очікувати, т.к. у цьому випадку означає, що вміст елемента відсутній.

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

Нижче наведено приклад більш складного XSL-опису, деякі фрагменти якого будуть пояснені пізніше.

Розбір будь-якого XSL-документа завжди починається з правила для кореневого елемента, в якому визначається область всього XML документа, що розбирається, і тому теги форматування, поміщені сюди, будуть діяти на весь документ в цілому. Для позначення кореневого правила необхідно включити до нього елемент; Наприклад, для того, щоб задати тег для вихідної HTML-сторінки, що формується нами, ми можемо використовувати наступний фрагмент:

У цьому прикладі за допомогою інструкцій ми визначили ряд початкових і кінцевих HTML-тегів для нашої сторінки, між якими потім у процесі рекурсивного обходу XSL- аналізатора будуть розміщені інші елементи документа.

У тому випадку, якщо ми не визначаємо правило для кореневого елемента, розбір документа почнеться з першого правила з інструкцією (для оформлення заголовка документа буде використаний зразок форматування, що застосовується за умовчанням).

Відносини між елементами

Дочірні елементи в XML-документі завжди знаходяться всередині області, яка визначається тегами батьківського по відношенню до них елемента. Для того, щоб точно вказати місце розташування оброблюваного елемента в дереві XML,в XSL використовується додатковий тег;. За допомогою нього можна вказати, які елементи повинні передувати поточному, а які слідувати після нього. Наприклад, у наступному фрагменті визначається, що форматування елемента залежатиме від його розташування всередині XML-документа:

Як видно з прикладу, якщо в XML-документі буде знайдений елемент , що є дочірнім по відношенню до елемента (назва статті), то його форматування буде дещо відрізнятися від елемента , розташованого всередині тегів

У тому випадку, якщо всередині XSL-документа зустрічається кілька правил для того самого елемента, то msxsl буде використовувати те з них, яке більш точно визначає позицію даного елемента. Тобто. якщо XSL-документ містить такі правила:

, при використанні цієї стильової таблиці у разі, коли елемент є нащадком , до нього буде застосовано перше правило. Для будь-яких інших елементів діятиме правило без тега

У випадку пріоритет правил визначається в такий спосіб (у порядку зменшення пріоритету):

  • правила, позначені спеціальним тегом
  • правила з найбільшим значенням атрибуту id, якщо його визначено
  • правила з найбільшим значенням атрибуту class, якщо його визначено
  • правила, що мають найбільшу вкладеність, що визначається тегом
  • правила, що використовують атрибут type спільно з
  • правила, в яких відсутній атрибут type або
  • правила з вищим пріоритетом, що задається атрибутом priority тега
  • правила з найбільшим значенням кваліфікаторів,

Використання атрибутів елементів

Одним із найпотужніших засобів XSL є можливість сортування та вибірки елементів, що виділяються із загального дерева елементів документа. Для цьоговикористовується елемент;, який замінює у правилах, визначаючи ті елементи, які слід обробити у процесі рекурсивного обходу. Наприклад, в наступному прикладі будуть оброблені тільки елементи:

Елемент сам не визначає шаблон форматування, він лише керує роботою аналізатора, позначаючи, подібно , " нижчі " елементи. У наведеному прикладі елемент повинен бути розташований усередині елемента

А, щоб у шаблоні виділити як власні дочірні елементи, а й дочірні елементи нащадків, тобто. Використовуючи кілька рівнів вкладеності, необхідно встановити параметр from = "descendants". Якщо параметр має значення "children", що вказує на те, що вибір повинен проводитися зі списку власних дочірніх елементів, атрибут from може опускатися, т.к. "children" є значенням за промовчанням.

На відміну від CSS, XSL неможливе використання каскадних стильових визначень (тобто не можна використовувати кілька правил для визначення стилю одного того ж елемента), т.к. такі обмеження запроваджує рекурсивний алгоритм роботи програми – аналізатора. Однак використання правил визначення стилю (Style Rules) елемента дозволяє якимось чином компенсувати цей недолік.

Для визначення правила стильового оформлення необхідно скористатися елементом ;, який використовується так само, як і , але інструкції, що містяться в ньому, ніяк не впливають на структуру вихідного документа. Тому всі команди всередині цього правила повинні описуватись у рамках елемента. Ось як виглядатиме, наприклад, визначення стилю для елемента rose;:

Якби ми не визначили правила , то вихідний документ був би поміщено жодної інформації, т.к. елемент тільки визначає параметри стильового оформлення, не роблячижодних інших дій.

Також треба враховувати, що XSL-аналізатор використовує CSS для визначення стилю, що задається правилами, у вихідному HTML-документі, тим самим надаючи нам можливість використання цього потужного засобу при оформленні HTML-сторінок. один приклад:

Стилі у форматі CSS:

Фрагмент XSL-документа, що дозволяє використовувати подібні стильові визначення:

Сценарії можуть використовуватися в документах XSL так само, як і в HTML. Крім того, сценарії, що містяться всередині XSL-документа і запускаються броузером у процесі обробки документа, можуть динамічно створювати HTML-документи, витягуючи необхідну для цього інформацію безпосередньо з елементів XSL-документа.

, у вихідному документі виявляться такі інструкції:

Найчастіше у правилах XSL необхідно використовувати атрибути описуваного у них елемента. Для цього ми повинні скористатися методом getAttribute(), описаним у об'єктній моделі XML (ми розглядаємо об'єктну модель XML-документів, запропоновану Microsoft, список цих функцій наведено в кінці розділу). Т.к. кожному елементу XSL доступний покажчик на відповідний йому об'єкт, сценарій може звертатися до внутрішніх функцій та властивостей цих елементів, за допомогою яких здійснюються необхідні дії.

Для того, щоб використовувати цей атрибут у вихідному HTML-документі, необхідно визначити таке правило:

Після обробки цього фрагмента у вихідний документ буде розміщено елемент:

Метод childNumber у разі повертає поточний номер дочірнього елемента.

Визначення функцій та глобальних змінних

Якщо використовувати ці правила длянаступного XML-документа: то в результаті ми отримаємо такий HTML-файл: