Технологія XSLT

елемента

Книга присвячена розробці додатків для перетворення XML-документів з використанням XSLT — мови стилів для перетворень, що розширюється. Обговорюється застосування мов XSLT і XPath у вирішенні практичних завдань: виведення документів у форматі HTML, використання різних кодувань для інтернаціоналізації та, зокрема, русифікації програм, питань ефективності існуючих підходів для вирішення проблем перетворення. Для ілюстрації матеріалу використовується велика кількість прикладів.

Для початківців та професійних програмістів

Технологія XSLT

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

Для обчислення порядкових номерів вузлів у дереві XSLT існує кілька способів. У простих випадках для досягнення мети досить скористатися одним з наступних XPath-виразів.

? Для того щоб отримати порядковий номер поточного вузла в множині, можна використовувати функцію position . Звернемо увагу, що це буде позиція вузла в множині, що обробляється в даний момент, а не в дереві вихідного документа.

? Функція count(preceding-sibling::*)+1 повертає порядковий номер поточного елемента серед інших елементів його батька, інакше кажучи серед його братів. Шлях вибірки preceding-sibling::* вибирає безліч братніх елементів, що передують поточному вузлу, а функція count обчислює їх кількість. Таким чином, значенняcount(preceding-sibling::*)+1 дорівнюватиме 1 для першого елемента (оскільки йому інші елементи не передують), 2 — для другого (йому передує один елемент) і так далі.

? Для того щоб враховувати при підрахунку лише певні елементи, можна переписати попередній вираз у трохи суворішому вигляді. Наприклад, вираз, який вважає лише елементи chapter , буде задаватися в такий спосіб: (preceding-sibling::chapter) +1 .

? Глибина поточного вузла кореня дерева може бути обчислена виразом count(ancestor-or-self::node()). Цей вираз повертатиме 1 для кореневого вузла, 2 для елемента документа і так далі.

Обчислювати вирази і виводити обчислені значення в результуюче дерево слід, як і зазвичай, за допомогою елемента xsl:value-of.

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

Іншим, незрівнянно більш легким та зручним способом нумерації та індексування вузлів є використання елемента xsl:number .