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

ЖАНРЫ

Технология XSLT

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

Шрифт:
Листинг 3.15. Результат

<result>

Integers:

123

Reals:

123.5

Reals minus integers:

0.5

</result>

Таблица преобразования типов

Для удобства использования все взаимные преобразования типов сведены в одну таблицу (табл. 3.2).

Таблица 3.2. Взаимные преобразования типов данных XSLT

Преобразовываемый
тип
Целевой тип
boolean
(булевое значение)
number
(число)
string
(строка)
node-set
(множество узлов)
tree
(дерево)
boolean
(булевое значение)
 false NaN 
→ 
false
другое → 
true
пустая → 
false
непустая → 
true
пустое → 
false
другое → 
true
всегда
true
number
(число)
false
0 true
1
разбирается, как число в десятичном формате мн-во → строка → число дерево → строка → число
string
(строка)
false 
→ 
"false" true 
→ 
"true"
десятичная запись числа строковое значение первого узла в порядке просмотра строковое сложение всех текстовых узлов дерева
node-set
(множество узлов)
нет нет нет нет
tree
(дерево)
нет нет нет нет

Переменные

Несмотря на отсутствие побочных эффектов, которое является одним из основных принципов XSLT, в преобразованиях можно использовать переменные. Переменная определяется как имя, с которым связывается некоторое значение, например:

<xsl:variable name="url" select="'http://www.xsltdev.ru'"/>

создаст переменную с именем

url
и присвоит ей строковое значение
"http://www.xsltdev.ru"
. После этого переменную можно использовать в выражениях, например:

<xsl:value-of select="concat('Welcome to ', $url)"/>

Для того чтобы отличать переменные от путей выборки, в выражениях их именам предшествует префикс "

$
": к значению переменной с именем
url
мы обращались как к
$url
.

Каждая из переменных имеет собственную область видимости (англ. visibility scope) — область документа преобразования, в которой может быть использовано ее значение. В зависимости от этого переменные могут быть глобальными (видимыми во всем преобразовании) и локальными (видимыми только в своем родительском элементе).

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

что значения, присваиваемые параметрам, являются значениями по умолчанию и могут быть изменены извне — например, вызывающим шаблонное правило элементом типа
xsl:apply-templates
или
xsl:call-template
, или самим процессором, если речь идет о глобальных параметрах.

Использование переменных и параметров в XSLT отличается от их использования в привычных процедурных языках программирования типа С++, Java или Object Pascal из-за того, что их значения не могут изменяться. После того, как переменной или параметру присвоено некоторое изначальное значение, оно будет оставаться неизменным.

Это ограничение оказывает значительное влияние на стиль программирования преобразований. В этом смысле XSLT намного ближе к функциональным языкам типа Lisp. Например, в XSLT часто используется рекурсия, которая является одним из основных принципов функционального программирования.

Выражения

Многие из задач, которые, так или иначе, выполняются во время преобразования, связаны с вычислением выражений. Для этих целей в XSLT используется язык XPath, который помимо выбора множеств узлов дерева может также выполнять некоторые основные операции над данными.

Замечание

Несмотря на то, что XPath является самостоятельным языком, его роль в XSLT настолько велика, что здесь и далее мы будем рассматривать их как единое целое.

Можно выделить четыре основные задачи, для которых в преобразованиях используются выражения:

□ выбор узлов для обработки;

□ описание условий;

□ вычисление строковых значений, которые затем будут использованы в выходящем дереве;

□ вычисление множеств узлов, которые затем будут использованы в выходящем дереве.

Первая из задач непосредственно относится к самому процессу преобразования. Выражения, содержащиеся в атрибутах

select
элементов
xsl:apply-templates
и
xsl:for-each
, вычисляют множества, к узлам которых нужно применить шаблоны.

Пример
Листинг 3.16

<xsl:template match="HTML">

 <html>

<xsl:apply-templates select="HEAD"/>

<xsl:apply-templates select="BODY"/>

 </html>

</xsl:template>

В этом шаблонном правиле содержатся два элемента

xsl:apply-templates
, которые применяют шаблоны к множествам, выбранным выражениями
HEAD
и
BODY
соответственно.

Логические выражения XPath могут использоваться в качестве условий в таких элементах, как

xsl:if
и
xsl:when
, обеспечивая условную обработку.

Пример

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

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

<person>

 <name>Johnny</name>

 <age>19</age>

</person>

Листинг 3.18. Преобразование

<xsl:stylesheet

 version="1.0"

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

 <xsl:template match="person">

<xsl:if test="age &gt;= 21">

<xsl:text>Welcome, </xsl:text>

<xsl:value-of select="name"/>

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