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

ЖАНРЫ

Технология XSLT

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

Шрифт:
Пример

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

<xsl:stylesheet

 version="1.0"

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

 xmlns:a="uri:a"

 xmlns:b="uri:b">

 <xsl:variable name="a:elementcount" select="count(//a:*)"/>

 <xsl:variable name="b:elementcount" select="count(//b:*)"/>

 ...

</xsl:stylesheet>

В

этом преобразовании количество элементов документа, принадлежащих пространству имен
а
, будет содержаться в переменной
a:elementcount
, а пространству имен
b
— в переменной
b:elementcount
.

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

<xsl:template match="counts">

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

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

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

</xsl:template>

будет корректен, в шаблоне

<xsl:template match="counts" xmlns="uri:a">

 <xsl:value-of select="$elementcount"/>

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

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

</xsl:template>

процессор не сможет найти объявление переменной

$elementcount
, потому что расширенное имя объявленной переменной состоит из URI пространства имен
"uri:а"
и локальной части имени
elementcount
, а расширенное имя переменной
elementcount
состоит из нулевого URI и локальной части
elementcount
. Иными словами, эти переменные принадлежат разным пространствам.

Операции с булевыми значениями

XPath поддерживает только две логические операции —

and
(логическое "и") и
or
(логическое "или"). В XPath нет оператора логического отрицания, вместо него применяется функция
not
, которая возвращает "истину", если аргументом была "ложь" и наоборот.

Логические операторы в XPath бинарны, то есть требуют два операнда булевого типа. Если операнды имеют другой тип, то они будут приведены к булевым значениям.

Логические вычисления в XPath абсолютно стандартны. Мы приведем их для справки в табл. 6.2.

Таблица 6.2. Вычисление логических выражений

Значение Выражение
A
B
A or В
A and В
false
false
false
false
false
true
true
false
true
false
true
false
true
true
true
true

Как

и во многих других языках, операция "и" (
and
) старше операции "или" (
or
). Например, такое выражение, как
A and B or C and D or E
эквивалентно выражению
(A and В) or (С and D) or E
.

Приведем синтаксические правила продукций логических операций XPath. Операции "или" соответствует продукция

OrExpr
, операции "и" — продукция
AndExpr
.

[XP21] OrExpr ::= AndExpr | OrExpr 'or' AndExpr

[XP22] AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr

Операции с числами

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

Арифметические операции

Арифметические операции XPath сведены в табл. 6.3.

Таблица 6.3. Арифметические операции в XPath-выражениях

Операция Синтаксис
Сложение
A + B
Вычитание
A - B
Умножение
A * B
Деление
A div B
Остаток деления
A mod B
Унарное отрицание
– A

Если операнды, значения, участвующие в операции, не являются числами, они сначала приводятся к этому типу, а уж затем производится операция. Например, можно легко перемножать литералы:

'2' * '2'
4

Арифметические действия в XPath работают, что называется, "как обычно", то есть совершенно стандартным образом. Арифметика XPath основывается на стандарте IEEE 754, который был использован и в других распространенных языках программирования, например в Java. Пожалуй, следует лишь обратить внимание на операторы деления, поскольку в разных языках они означают разные действия и потому легко запутаться.

Оператор

div
делит свой первый операнд на второй. Это не целочисленное деление, как в некоторых других языках,
div
осуществляет деление чисел с плавающей точкой. Оператор
div
аналогичен оператору деления "
/
" в таких языках, как Java, С++ и Pascal.

Примеры:

3.2 div 2.5
1.28

3.2 div -2.5
– 1.28

– 3.2 div -2.5
1.28

Оператор

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

3.2 mod 2
1.2

3.2 mod -2
1.2

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