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

ЖАНРЫ

Технология XSLT

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

Шрифт:

false and $var
false

Это выражение всегда будет ложным вне зависимости от значения переменной

var
, поскольку конъюнкция (логическая операция "и") с тождественной "ложью" всегда будет "ложью".

Функция lang

boolean lang(string)

Функция

lang
может использоваться для того, чтобы определить языковой контекст контекстного узла. В элементах XML можно использовать атрибут
lang
пространства имен
xml
для определения языка содержимого узла, например;

<text xml:lang="en-gb">

Yet no living human being have been ever blessed with seeing...

</text>

Пространство имен, соответствующее префиксу

xml
, не требуется объявлять. Это служебное пространство имен, которое неявно задано во всех XML-документах.

Функция

lang
возвратит "истину", если идентификатор языка, который передан ей в виде строкового параметра, соответствует языковому контексту контекстного узла. Это определяется следующим образом.

□ Если ни один из предков контекстного узла не имеет атрибута

xml:lang
, функция возвращает "ложь".

□ Иначе строковый параметр проверяется на соответствие значению атрибута

xml:lang
ближайшего предка. Если эти значения равны в любом регистре символов, или атрибут начинается как значение параметра функции и имеет суффикс, начинающийся знаком "
", функция возвращает "истину".

□ В противном случае функция возвращает "ложь".

Примеры:

Функция

lang('en')
возвратит "истину" в контексте любого из следующих элементов:

<body xml:lang="EN"/>

<body xml:lang="en-GB"/>

<body xml:lang="en-us"/>

<body xml:lang="EN-US"/>

Функция

lang('de')
возвратит "истину" в контексте элемента
b
и "ложь" — в контексте элементов
а
и
с
:

<а>

 <b xml:lang="de">

<c xml:lang="en"/>

 </b>

</a>

Числовые функции

Функция number

number number(object?)

Функция

number
явным образом конвертирует свой аргумент в числовой тип. Если аргумент не указан, функции передается множество узлов, состоящее из единственного контекстного узла. Коротко напомним правила преобразования в числовой тип.

□ Значения булевого типа преобразуются в

0
или
1
следующим образом: "ложь" преобразуется в
0
, "истина" в
1
.

□ Строковое значение преобразуется в число, которое оно представляет.

□ Множество узлов сначала преобразуется в строку, а затем, как строка в число. Фактически численным значением множества узлов является численное значение его первого узла.

□ Объекты других типов преобразуются в число в соответствии с собственными правилами. Например, результирующий фрагмент дерева так же как и множество узлов сначала преобразуется

к строке, а затем в численный формат.

Примеры

number($to_be or not($to_be))
1

Значение этого выражения будет

1
, поскольку
$to_be or not($to_be)
будет истинным вне зависимости от значения переменной
to_be
.

number(false)
0

number('00015.0001000')
15.0001

number('.0001000')
0.0001

number('1.')
1

number('-.1')
– 0.1

number('-5')
– 5

Функция sum

number sum(node-set)

Функция

sum
суммирует значения узлов из переданного ей множества. Строковые значения узлов сначала преобразуются в числа, а затем все полученные числа складываются.

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

<list>

 <item>1</item>

 <item>3</item>

 <item>5</item>

</list>

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

<xsl:stylesheet

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

 version="1.0">

 <xsl:template match="list">

<xsl:copy>

<xsl:apply-templates/>

</xsl:copy>

 </xsl:template>

 <xsl:template match="item">

<sum>

<xsl:value-of select="sum(preceding-sibling::item|.)"/>

</sum>

 </xsl:template>

</xsl:stylesheet>

Листинг 6.5. Результат

<list>

 <sum>1</sum>

 <sum>4</sum>

 <sum>9</sum>

 <sum>16</sum>

 <sum>25</sum>

</list>

В этом преобразовании мы заменяем каждый элемент

item
на сумму значений предшествующих ему элементов плюс собственное значение. Предшествующие элементы выбираются путем выборки
preceding-sibling::item
, текущий элемент — сокращенным путем "
.
", затем эти два множества объединяются при помощи оператора
|
, и, наконец, мы вычисляем сумму значений узлов, входящих в них функцией
sum
.

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