Выбрать главу

8 16 24 32 40 48 56 64 72

9 18 27 36 45 54 63 72 81

В данном случае элемент xsclass="underline" value-of используется для вычисления произведения переменных a и b. Численный результат преобразуется в строку и выводится в выходящий документ в виде текста.

Равно, как и xsclass="underline" text, элемент xsclass="underline" value-of может иметь атрибут disable-output-escaping, полезный для вывода специальных символов, которые в противном случае были бы заменены сущностями.

Пример

Результатом выполнения элемента

<xsclass="underline" value-of select="concat('Divide ', '&amp;', ' impera')"/>

будет текстовый узел

Divide &amp; impera

Чтобы придать амперсанту более привычный вид, мы можем использовать атрибут disable-output-escaping:

<xsclass="underline" value-of

select="concat('Divide ', '&amp;', ' impera')"

disable-output-escaping="yes"/>

Результатом выполнения этого шаблона уже будет текст:

Divide & impera

Создание узлов комментариев и инструкций по обработке

Элемент xsclass="underline" comment

Этот элемент задается конструкцией вида:

<xsclass="underline" comment>

<!-- Содержимое: шаблон -->

</xsclass="underline" comment>

Элемент xsclass="underline" comment создает в результирующем дереве узел комментария. Текстом комментария становится результат выполнения шаблона, который содержится в элементе xsclass="underline" comment.

Точно так же как и в случае с xsclass="underline" processing-instruction, результат выполнения шаблона должен содержать только текстовые узлы. Узлы других типов будут либо проигнорированы, либо вызовут ошибку.

В соответствии с синтаксисом XML, комментарий в XML не может содержать двух знаков "-" последовательно ("--") и оканчиваться на "-". Поэтому наличие таких последовательностей символов в тексте комментария будет являться в XSLT ошибкой. Для того чтобы избежать некорректного синтаксиса, процессор может разделять два последовательных минуса пробелом (заменять "--" на "- -") или добавлять пробел после завершающего минуса комментария.

Пример

Элемент:

<xsclass="underline" comment>&#xA; | Please remove this later&#xA; +</xsclass="underline" comment>

создаст комментарий:

<!--

 | Please remove this later

 +-->

Элемент xsclass="underline" processing-instruction

Синтаксис элемента представлен ниже:

<xsclass="underline" processing-instruction

 name="{имя}">

 <!-- Содержимое: шаблон -->

</xsclass="underline" processing-instruction>

Элемент xsclass="underline" processing-instruction создает в результирующем дереве узел инструкции по обработке. Обязательный атрибут name определяет имя целевого приложения, которому будет адресована инструкция по обработке. В этом атрибуте может быть указан шаблон значения атрибута.

Пример

Элемент:

<xsclass="underline" processing-instruction name="servlet">

 <xsclass="underline" text>links="follow" session-timeout="7200000"</xsclass="underline" text>

</xsclass="underline" processing-instruction>

создаст в выходящем документе инструкцию по обработке вида:

<?servlet links="follow" session-timeout="7200000"?>

Содержимым создаваемой инструкции по обработке является результат выполнения шаблона, содержащегося внутри элемента xsclass="underline" processing- instruction. Этот результат должен содержать только текстовые узлы, в противном случае процессор может либо выдать ошибку, либо проигнорировать нетекстовые узлы вместе с их содержимым.

Инструкция по обработке не может содержать последовательности символов "?>", поскольку это было бы некорректно с точки зрения синтаксиса XML.

В случае, если результат выполнения шаблона содержит такую комбинацию, процессор может либо выдать ошибку, либо разделить символы "?" и ">" пробелом:"? >".

Имя инструкции по обработке, должно быть корректным XML-именем (но не равным при этом "xml" в любом регистре символов). Например, следующее определение будет совершенно корректным:

<xsclass="underline" processing-instruction name="_">

 <xsclass="underline" text>logout _</xsclass="underline" text>

</xsclass="underline" processing-instruction>

В результате получится следующая инструкция: <?_ logout _?>

Для того чтобы создать в выходящем XML-документе инструкцию xml-stylesheet, которая используется для связывания документов со стилями и преобразованиями, можно воспользоваться следующим определением:

<xsclass="underline" processing-instruction name="xml-stylesheet">

 <xsclass="underline" text>href="style.xsl" type="text/xsl"</xsclass="underline" text>

</xsclass="underline" processing-instruction>

Результирующий документ будет содержать инструкцию по обработке в виде:

<?xml-stylesheet href="style.xsl" type="text/xsl"?>

Элемент xsclass="underline" processing-instruction не может создать декларацию XML, несмотря на то, что с точки зрения синтаксиса (но не семантики) она имеет форму инструкции по обработке. Для вывода XML-декларации следует использовать элемент xsclass="underline" output.

Копирование узлов

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

Элемент xsclass="underline" copy

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

<xsclass="underline" copy

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

 <!-- Содержимое: шаблон -->

</xsclass="underline" copy>

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

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

Пример

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

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

<а> text

 <b attr="value"/>

 <c/>

 <d>

  text

  <e/>

 </d>

</a>

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

<xsclass="underline" template match="@*|node()">