xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
MASS="{MASS} {MASS/@UNITS}"
RADIUS="{RADIUS} {RADIUS/@UNITS}"
DAY="{DAY} {DAY/@UNITS}"/>
И вот результат, включающий единицы измерения:
MASS=".0553 (Earth = 1)" NAME="Mercury"/>
MASS=".815 (Earth = 1)" NAME="Venus"/>
MASS="1 (Earth = 1)" NAME="Earth"/>
Заметьте, что в шаблонах значений атрибутов нельзя использовать вложенные фигурные скобки, и в выражении, использующем фигурные скобки, — таком как function printHello {cout << 'Hello';}
— фигурные скобки необходимо удваивать, для того чтобы процессор XSLT их игнорировал: function printHello {{cout<<'Hello';}}
.
Шаблоны значений атрибутов всегда работают с контекстным узлом. Тем не менее, нельзя использовать шаблоны значений атрибутов в произвольном месте таблицы стилей, что зачастую и вызывает затруднения у XSLT-разработчиков. Шаблоны значений атрибутов можно использовать только в следующих местах:
• элементы буквального результата;
• элементы расширения (см. главу 5);
• . Здесь можно использовать атрибуты name
и namespace
(см. главу 6);
• . Здесь можно использовать атрибуты name
и namespace
(см. главу 6);
• . Здесь можно использовать атрибуты format
, lang
, letter-value
, grouping-separator
и grouping-size
(см. главу 4);
• . Здесь можно использовать атрибут name
(см. главу 6);
• . Здесь можно использовать атрибуты lang
, data-type
, order
и case-order
(см. главу 5).
В главе 6 эта тема рассмотрена более подробно: мы узнаем, как создавать атрибуты (и новые элементы) с нуля. Дополнительная информация об использовании выражений XPath в шаблонах значений атрибутов приведена в главе 7.
Обработка символов-разделителей
Поначалу символы-разделители (whitespace) доставляют авторам XSLT много хлопот. В главе 2 объяснялось, что «чистые» узлы-разделители — это текстовые узлы, содержащие только символы-разделители (пробелы, возвраты каретки, переводы строки и символы табуляции). Эти узлы по умолчанию копируются из исходного документа.
Заметьте, что в таблице стилей также могут быть узлы-разделители:
В нашем случае пробелы используются для выравнивания элементов таблицы стилей, а возвраты каретки — для разрежения кода. Чистые узлы-разделители, такие, как этот, не копируются из таблицы стилей в выходной документ. Заметьте, однако, что разделитель из следующего элемента копируется в выходной документ, так как это не чистый узел-разделитель (он также содержит текст «The Planets Table»):
The Planets Table
.
.
.
Если вы хотите убрать этот разделитель и сохранить выравнивание, можно использовать пустые элементы , так чтобы символы-разделители стали чистыми узлами-разделителями:
The Planets Table
.
.
.
Чистые узлы-разделители не копируются из таблицы стилей в выходной документ, если только они не находятся внутри элемента , или у элемента, в который они вложены, атрибут xml:space
не установлен в «preserve» (сохранить).
С другой стороны, по умолчанию XSLT сохраняет текстовые узлы разделители в исходном документе и копирует их в результирующий документ. Возьмите уже рассмотренную нами копирующую таблицу стилей, которая копирует все элементы из исходного документа в результирующий:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
и примените ее к planets.xml
; все символы-разделители будут также скопированы в результирующий документ:
Mercury
.0553
58.65
1516
43.4
.
.
.
Тем не менее, иногда требуется удалить разделители, используемые при форматировании входных документов — это можно сделать при помощи элемента .
Элемент дает указание процессору XSLT убрать все чистые узлы-разделители (также называемые «потребляемыми», expendable, узлами-разделителями) из. выходного документа. Чистый узел-разделитель состоит только из символов-разделителей и не содержит текст какого-либо другого вида. У этого элемента только один атрибут:
• elements
(обязательный). Задает элементы, из которых нужно убрать символы-разделители. Представляет, собой список разделённых символами-разделителями NameTest
(именами или обобщёнными именами с символами подстановок).
Элемент не включает содержимого. Например, чтобы удалить все узлы-разделители из planets.xml
, можно применить следующим образом:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Читать дальше