Элемент xsl:copy
создает копию текущего узла вне зависимости от его типа. Вместе с текущим узлом в выходящее дерево копируются только узлы пространств имен, ассоциированные с ним. Дочерние узлы и узлы атрибутов в выходящий документ не копируются.
Если xsl:copy
используется для копирования корневого узла или узда элемента, в выходящем документе процессор создает дочерний фрагмент дерева, являющийся результатом выполнения шаблона, содержащегося в xsl:copy
.
Пример
Предположим, что в каждый элемент преобразовываемого документа нам нужно добавить атрибут element-count
со значением, равным количеству его дочерних элементов, а все остальные узлы оставить, как есть.
Листинг 7.17. Входящий документ
<���а> text
text
Листинг 7.18. Шаблон преобразования
Листинг 7.19. Выходящий элемент
text
text
Если xsl:copy
используется для создания в выходящем документе копии узла элемента, в него при помощи атрибута use-attribute-sets
могут быть также включены именованные наборы атрибутов ( см. раздел "Именованные наборы атрибутов" данной главы ).
Пример
Предыдущее преобразование может быть переписано в виде
Результат преобразования будет абсолютно идентичен выходящему документу, полученному в предыдущем примере.
Синтаксис элемента несложен:
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
В XSLT имеются две инструкции, которые поддерживают условную обработку — xsl:if
и xsl:choose
. Инструкция xsl:if
позволяет создавать простые условия типа "если-то", в то время как xsl:choose
создает более сложную конструкцию для выбора одной из нескольких имеющихся возможностей в зависимости от выполнения тех или иных условий.
Синтаксис элемента следующий:
test=" выражение ">
Элемент xsl:if
является простейшим условным оператором в XSLT. Выражение, содержащееся в обязательном атрибуте test
, вычисляется и приводится к булевому типу. В том и только том случае, если выражение имеет значение true
, процессор выполняет шаблон, содержащийся в xsl:if
.
Вследствие того, что атрибуты в XML не могут содержать некоторые специальные символы (такие как " <
" и " &
"), их необходимо заменять символьными сущностями. В особенности это касается сравнения чисел типа "меньше"; объявление вида
будет с точки зрения синтаксиса XML некорректным. Вместо него следует использовать эквивалентное объявление
Следует заметить, что символ "больше" (" >
") заменять сущностью необязательно. Однако из соображений единообразия принято заменять и его.
Читать дальше