Элемент 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 некорректным. Вместо него следует использовать эквивалентное объявление
Следует заметить, что символ "больше" (" >") заменять сущностью необязательно. Однако из соображений единообразия принято заменять и его.
Читать дальше