Технология XSLT — страница 30 из 66

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

xsl:copy
и
xsl:copy-of
, использование которых будет подробно разобрано ниже.

Элемент xsl:copy

Ниже представлена синтаксическая конструкция этого элемента:

 use-attribute-sets = "наборы атрибутов">

Элемент

xsl:copy
создает копию текущего узла вне зависимости от его типа. Вместе с текущим узлом в выходящее дерево копируются только узлы пространств имен, ассоциированные с ним. Дочерние узлы и узлы атрибутов в выходящий документ не копируются.

Если

xsl:copy
используется для копирования корневого узла или узда элемента, в выходящем документе процессор создает дочерний фрагмент дерева, являющийся результатом выполнения шаблона, содержащегося в
xsl:copy
.

Пример

Предположим, что в каждый элемент преобразовываемого документа нам нужно добавить атрибут

element-count
со значением, равным количеству его дочерних элементов, а все остальные узлы оставить, как есть.

Листинг 7.17. Входящий документ

<а> text

  text

Листинг 7.18. Шаблон преобразования

Листинг 7.19. Выходящий элемент

 text

  text

Если

xsl:copy
используется для создания в выходящем документе копии узла элемента, в него при помощи атрибута
use-attribute-sets
могут быть также включены именованные наборы атрибутов (см. раздел "Именованные наборы атрибутов" данной главы).

Пример

Предыдущее преобразование может быть переписано в виде


Результат преобразования будет абсолютно идентичен выходящему документу, полученному в предыдущем примере.

Элемент xsl:copy-of

Синтаксис элемента несложен:

select="выражение"/>

Использование элемента

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

□ Если результат вычисления имеет булевый, числовой или строковый тип, то

xsl:copy-of
выводит его в виде текстового узла. В этом случае поведение
xsl:copy-of
абсолютно не отличается от поведения элемента
xsl:value-of
.

□ Если результатом вычисления выражения является множество узлов (node-set), то

xsl:copy-of
копирует в выходящий документ все узлы в порядке просмотра документа вместе с их потомками.

□ Если результатом вычисления является результирующий фрагмент дерева, то он копируется в выходящий документ в неизмененном виде.

Рассмотрим пример.

Листинг 7.20. Входящий документ

false

text

3.14

10

20

30

  text

   text

    text

Листинг 7.21. Преобразование

 version="1.0"

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




Value-of boolean:


Copy-of boolean:



Value-of string:


Copy-of string:



Value-of number:


Copy-of number:



Value-of node-set:


Copy-of node-set:



Value-of tree:


Copy-of tree:


Листинг 7.22. Выходящий документ

Value-of boolean:false

Copy-of boolean:false

Value-of string:text

Copy-of string:text

Value-of number:3.14

Copy-of number:3.14

Value-of node-set:10

Copy-of node-set:102030

Value-of tree:

  text


   text


Copy-of tree:

  text

   text

Условная обработка