• >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 перигелииСОММЕNT>
Обратите внимание: здесь текст для других элементов в элементе >
также включается в выходной документ, потому что так установлено в соответствии с правилом по умолчанию для каждого элемента. Поскольку для элементов я не предоставил какого-либо правила, их текст просто включается в выходной документ.
Выбор узлов при помощи 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