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

Условия узла (node test) составляют вторую часть образцов шага. В качестве условий узла можно использовать названия узлов или символ подстановки

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

Помимо названий узлов и символа подстановки, можно применять также следующие условия узлов:

• 

comment()
выбирает узлы комментария;

• 

node()
выбирает узел любого типа;

• 

processing-instruction()
выбирает узел инструкции обработки. В скобках можно указать название выбираемой инструкции обработки;

• 

text()
выбирает текстовый узел.

В следующих разделах мы изучим эти условия узлов и рассмотрим примеры их применения.

Выбор комментариев

Текст комментариев можно выбрать при помощи образца

comment()
. Разумеется, не следует хранить данные, которые попадут в выходной документ, в комментариях входного документа. Тем не менее, вам может потребоваться преобразовать комментарии из формы
в какую-то другую форму, используемую другим языком разметки, — например, элемент
.

В следующем примере я извлеку комментарии из

planet.xml
и включу их в полученные выходные данные.

Venus

"(Earth = 1)">.815

116.75

3716

.943

66.8

Чтобы извлечь комментарии и поместить их в элементы

, я включил правило только для комментариев (листинг 4.3).

Листинг 4.3. Выбор комментариев

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


Вот результат для Венеры, в котором комментарий преобразован в элемент

:

Venus

.815

116.75

3716

.943

66.8B перигелии

Обратите внимание: здесь текст для других элементов в элементе

также включается в выходной документ, потому что так установлено в соответствии с правилом по умолчанию для каждого элемента. Поскольку для элементов я не предоставил какого-либо правила, их текст просто включается в выходной документ.

Выбор узлов при помощи node()

В образце условие узла

node
выбирает любой узел, за исключением корневого узла — помните, что в действительности это
child::node()
. Предположим, мы хотим создать таблицу стилей, копирующую произвольный документ XML, используя
. (В главе 3 для этого применялся элемент
.) Можно начать так, как показано в следующем примере. В этом случае в применяемом шаблоне для выбора любого элемента или любого атрибута используется операция OR, с которой мы познакомимся позже в этой главе (этот шаблон фактически выбирает себя — для того чтобы продолжать копирование на много уровней вглубь):

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

Однако посмотрите на результат — обратите внимание на то, что в этой версии, выбирающей только элементы и атрибуты (

@*|*
), не копируются узлы-разделители и текстовые узлы:

Это, конечно, неполно. Если я, с другой стороны, буду выбирать по образцу "

@*|node()
" вместо "
@*|*
", новое правило шаблона выберет все узлы за исключением корневого узла (который создается в результирующем дереве автоматически), поэтому символы-разделители будут скопированы, так же как и текст (листинг 4.4).

Листинг 4.4. Копирующая таблица стилей

 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