<xsl:variable name='nodes' select='a/b'/>
то использовать в выражениях мы ее будем как $nodes.
Переменные, так же как элементы и атрибуты XML, могут иметь расширенные имена вида QName, состоящие из префикса пространства имен и локальной части имени. Это позволяет создавать переменные, принадлежащие различным пространствам имен.
Мы можем определить две переменные с одинаковыми локальными частями имен в разных пространствах, используя при определении имени префикс. Естественно, префикс должен быть заранее связан с 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>
</xsl:text>
<xsl:value-of select='$b:elementcount'/>
</xsl:template>
будет корректен, в шаблоне
<xsl:template match='counts' xmlns='uri:a'>
<xsl:value-of select='$elementcount'/>
<xsl:text>
</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.
| Значение | Выражение | ||
|---|---|---|---|
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
