XSLT - [51]

Шрифт
Интервал

• >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