Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

<xsl:text>&#10;</xsl:text>

□ Элемент

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

<xsl:text disable-output-escaping="yes">&lt;</xsl:text>

В остальных случаях символьные данные, включенные в элемент

xsl:text
, ведут себя так же, как и вне
xsl:text
.

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

Этот

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

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

<xsl:value-of

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

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

В обязательном атрибуте

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

Элемент

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

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

равносильно

<xsl: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. Преобразование, создающее таблицу умножения

<xsl:stylesheet

 version="1.0"

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

 <xsl:output method="text"/>

 <xsl:template match="numbers">

<xsl:variable name="numbers" select="number"/>

<xsl:for-each select="$numbers">

<xsl:variable name="a" select="."/>

<xsl:for-each select="$numbers">

<xsl:variable name="b" select="."/>

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

<xsl:if test="$a * $b &lt; 10">

<xsl:text> </xsl:text>

</xsl:if>

<xsl:value-of select="$a*$b"/>

<xsl:text> </xsl:text>

</xsl:for-each>

<xsl:text>&#xA;</xsl:text>

</xsl:for-each>

 </xsl:template>

</xsl: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

8 16 24 32 40 48 56 64 72

9 18 27 36 45 54 63 72 81

В данном случае элемент

xsl:value-of
используется для вычисления произведения переменных
a
и
b
. Численный результат преобразуется в строку и выводится в выходящий документ в виде текста.

Равно, как и

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

Пример

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

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

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

Divide &amp; impera

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

disable-output-escaping
:

<xsl:value-of

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

disable-output-escaping="yes"/>

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

Divide & impera

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

Элемент xsl:comment

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

<xsl:comment>

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

</xsl:comment>

Элемент

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

Точно так же как и в случае с

xsl:processing-instruction
, результат выполнения шаблона должен содержать только текстовые узлы. Узлы других типов будут либо проигнорированы, либо вызовут ошибку.

Поделиться с друзьями: