XSLT — страница 31 из 124

>

Однако

не копирует атрибуты — вот результат применения этой таблицы стилей к
planets.xml
:

Mercury

.0553

58.65

1516

.983

43.4

Venus

.815

116.75

3716

.943

66.8

Earth

1

1

2107

1

128.4

Копирование атрибутов несколько сложнее, потому что нужно найти какой-либо способ применить

к каждому атрибуту элемента. Это можно сделать, например, при помощи элемента
, о котором пойдет речь в главе 5.

Листинг 3.10. Копирование атрибутов

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

А вот результат — заметьте, что на этот раз атрибуты не затронуты:

Mercury

.0553

58.65

1516

.983

43.4

Venus

.815

116.75

3716

.943

66.8

Earth

1

1

2107

1

128.4

Но есть более простой путь проверить, что копируются все дочерние узлы, атрибуты и другие потомки узлов: вместо элемента

можно применить
.

ГЛУБОКОЕ КОПИРОВАНИЕ

Пример использования для осуществления глубокого копирования документа будет приведен в главе 4, в которой описывается функция узла и объясняется, как рекурсивно вызывать один и тот же шаблон.

Элемент

Элемент

позволяет осуществлять глубокое копирование узлов, при котором копируется не только узел, но и все его атрибуты и потомки. У этого элемента единственный атрибут:

• 

select
(обязательный). Узел или набор копируемых узлов. Этот элемент пуст и не имеет содержимого.

Ниже приведен пример работы этого элемента; в этом случае я заменил в листинге 3.10 элемент

элементом
, который явно выбирает для копирования все атрибуты контекстного элемента.

Листинг 3.11. Применение

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

Этот код работает так же, как и предыдущий пример, копируя все элементы и атрибуты. С другой стороны, можно вообще обойтись без каких-либо изменений в листинге 3.10, — я могу просто использовать

для того, чтобы скопировать весь документ, выбрав корневой узел и скопировав всех его потомков:

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

При помощи

можно также копировать конкретные узлы и их потомков вместо того, чтобы задавать подстановку *. Например, следующее правило копирует все элементы
и их потомков:

По этой причине я могу заменить элемент

на элемент
:

Элемент

При помощи элемента

можно дать указание процессору XSLT отобразить сообщение и, по выбору, прекратить обработку таблицы стилей. У элемента
один атрибут:

• 

terminate
(необязательный). Значение «yes» прекращает обработку. По умолчанию установлено «no».

Куда на самом деле будет отправлено сообщение, зависит от процессора XSLT. Для процессоров, основанных на Java, сообщение обычно отправляется в выходной поток ошибок Java, которому соответствует экран компьютера, если процессор XSLT был вызван из командной строки. Другие процессоры XSLT могут выводить сообщения во всплывающие окна или в web-страницы, отправляемые в браузеры.

В приведенном ниже листинге 3.12 я прекращаю обработку XSLT, когда процессор XSLT пытается преобразовать элемент

в
planets.xml
, выводя сообщение "