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

• элементы буквального результата;

• элементы расширения (см. главу 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 объяснялось, что «чистые» узлы-разделители — это текстовые узлы, содержащие только символы-разделители (пробелы, возвраты каретки, переводы строки и символы табуляции). Эти узлы по умолчанию копируются из исходного документа.

Заметьте, что в таблице стилей также могут быть узлы-разделители:

В нашем случае пробелы используются для выравнивания элементов таблицы стилей, а возвраты каретки — для разрежения кода. Чистые узлы-разделители, такие, как этот, не копируются из таблицы стилей в выходной документ. Заметьте, однако, что разделитель из следующего элемента

</code></pre> копируется в выходной документ, так как это не чистый узел-разделитель (он также содержит текст «The Planets Table»):</p><p><pre><code><xsl:template match="/PLANETS"></code></pre></p><p><pre><code><HTML></code></pre></p><p><pre><code><HEAD></code></pre></p><p><pre><code><b><TITLE></b></code></pre></p><p><pre><code><b>    The Planets Table</b></code></pre></p><p><pre><code><b>

   .

   .

   .

Если вы хотите убрать этот разделитель и сохранить выравнивание, можно использовать пустые элементы

, так чтобы символы-разделители стали чистыми узлами-разделителями:

</code></pre></p><p><pre><code><b><xsl:text/>The Planets Table<xsl:text/></b></code></pre></p><p><pre><code>

   .

   .

   .

Чистые узлы-разделители не копируются из таблицы стилей в выходной документ, если только они не находятся внутри элемента

, или у элемента, в который они вложены, атрибут
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">

Вот результирующий документ, полученный после применения этой таблицы стилей к

planets.xml
. Обратите внимание на то, что убраны все символы-разделители, в том числе все символы новой строки:

Mercury.055358.651516.98343.4Venus.815116.753716.94366.8Earth1121071128.4

Заметьте, что таким образом удаляются только чистые узлы-разделители. Например, текст элемента

Volcanoes for Dinner
не содержит чистых текстовых узлов-разделителей, поэтому текст «Volcanoes for Dinner» будет сохранен в выходном документе вместе с пробелами. Так будет даже тогда, когда текст будет содержать несколько пробелов подряд, как в «Volcanoes for Dinner».

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

. У этого элемента такой же атрибут, что и у
:

• 

elements
(обязательный). Задает элементы, в которых нужно сохранить символы-разделители. Представляет собой список разделенных символами-разделителями
NameTest