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

Создание текстовых узлов

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

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

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

<answer>No!</answer>

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

<xsclass="underline" template match="answer">

 The answer was &quot;<xsclass="underline" value-of select="text()"/>&quot;.

</xsclass="underline" template>

Листинг 7.13. Созданный текст

The answer was "No!".

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

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

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

<xsclass="underline" text

 disable-output-escaping="yes" | "no">

 <!-- Содержимое: символьные данные -->

</xsclass="underline" text>

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

□ Преобразования будут сохранять пробельные символы, находящиеся в элементе xsclass="underline" text. То есть, для того чтобы вывести в выходящий документ пробельный символ, например такой, как символ перевода строки, достаточно написать

<xsclass="underline" text>&#10;</xsclass="underline" text>

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

<xsclass="underline" text disable-output-escaping="yes">&lt;</xsclass="underline" text>

В остальных случаях символьные данные, включенные в элемент xsclass="underline" text, ведут себя так же, как и вне xsclass="underline" text.

Элемент xsclass="underline" value-of

Этот элемент является одним из наиболее часто используемых в XSLT. Он служит для вычисления значений выражений.

Синтаксическая конструкция элемента следующая:

<xsclass="underline" value-of

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

 disable-output-escaping="yes" | "no"/>

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

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

<xsclass="underline" value-of select="выражение"/>

равносильно

<xsclass="underline" copy-of select="string{выражение}"/>

Соответственно, преобразование различных типов данных в строковый тип производится точно так же, как если бы мы использовали для этой цели функцию string.

Пример

Для составления таблицы умножения можно воспользоваться следующим преобразованием.

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

<numbers>

 <number>1</number>

 <number>2</number>

 <number>3</number>

 <number>4</number>

 <number>5</number>

 <number>6</number>

 <number>7</number>

 <number>8</number>

 <number>9</number>

</numbers>

Листинг 7.15. Преобразование, создающее таблицу умножения

<xsclass="underline" stylesheet

 version="1.0"

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

 <xsclass="underline" output method="text"/>

 <xsclass="underline" template match="numbers">

  <xsclass="underline" variable name="numbers" select="number"/>

  <xsclass="underline" for-each select="$numbers">

   <xsclass="underline" variable name="a" select="."/>

   <xsclass="underline" for-each select="$numbers">

    <xsclass="underline" variable name="b" select="."/>

    <!-- Если результат произведения меньше 10, добавляем пробел -->

    <xsclass="underline" if test="$a * $b &lt; 10">

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

    </xsclass="underline" if>

    <xsclass="underline" value-of select="$a*$b"/>

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

   </xsclass="underline" for-each>

   <xsclass="underline" text>&#xA;</xsclass="underline" text>

  </xsclass="underline" for-each>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

1  2  3  4  5  6  7  8  9

2  4  6  8 10 12 14 16 18

3  6  9 12 15 18 21 24 27

4  8 12 16 20 24 28 32 36

5 10 15 20 25 30 35 40 45

6 12 18 24 30 36 42 48 54

7 14 21 28 35 42 49 56 63