Логические выражения, выражения сравнения и выражения набора (XPath)

Шаблоны фильтров могут содержать логические выражения, выражения сравнения и выражения набора. Сочетания клавиш, приведенные в следующей таблице, представляют собой альтернативные символы, предоставляемые данной реализацией файла преобразований XSLT. Эти операторы выражений описаны в настоящем документе.

Оператор

Описание

and

Логическое И

or

Логическое ИЛИ

not()

Отрицание

=

Равенство

!=

Не равно

< *

Меньше

<= *

Меньше или равно

> *

Больше

<= *

Больше или равно

|

Операция множества. Возвращает объединение двух множеств узлов

* Расширенный метод XPath

Согласно рекомендациям консорциума W3C, в конструкциях с ключевыми словами операторов используются пробелы и другие разделители, а не знаки доллара ($), как было в версии 2.5. В синтаксисе W3C бинарное ключевое слово вида $xxx$ можно выразить как wsxxxws,, где ws означает символ-завершитель лексемы, который может быть пробелом, одинарной кавычкой (') или двойной кавычкой ("). С унарными операторами, например not(), используется нотация функций. Реализация Майкрософт поддерживает оба вида конструкций, но для совместимости с будущими версиями рекомендуется использовать синтаксис W3C.

В следующей таблице показан приоритет операций сравнения и логических операций (от высокого к низкому).

Приоритет

Операторы

Описание

1

( )

Группирование

2

[ ]

Фильтры

3

/

//

Операции с путями

4

< или &lt;

<= или &lt;=

> или &gt;

>= или &gt;=

Сравнения

5

=

!=

Сравнения

6

|

Объединение

7

not()

Логическое НЕТ

8

And

Логическое И

9

Or

Логическое ИЛИ

При использовании операторов в XML-документе (например, в таблице стилей XSLT) маркеры < и > нужно экранировать, получая, соответственно, &lt; и &gt;. Например, следующая инструкция XSLT применяет правило шаблона XSLT ко всем элементам <book>, элемент <price> которых имеет численное значение, меньшее или равное 10.

<xsl:apply-templates select="book[price &lt;= 10]"/>

При использовании выражения XPath с моделью DOM нет необходимости экранировать операторы < и >. Например, следующая инструкция JScript выбирает все элементы <book>, элемент <price> которых имеет численное значение, меньшее или равное 10.

var cheap_books = dom.selectNodes("book[price <= 10]");

Логические выражения могут совпадать со всеми узлами, имеющими определенное значение, либо с узлами, имеющими узлы в определенном диапазоне. Ниже приведен пример логического выражения, возвращающего значение false.

1 &gt;= 2

Операторы обрабатываются с учетом регистра.

Логическое «и» и логическое «или»

Логические операторы and и or выполняют операции логического «и» и логического «или» соответственно. Эти операторы и группирующие скобки позволяют строить усложненные логические выражения.

ms256081.collapse_all(ru-ru,VS.120).gifПримеры

Выражение

Ссылается на

author[degree and award]

Все элементы <author>, которые содержат хотя бы один элемент <degree> и хотя бы один элемент <award>.

author[(degree or award) and publication]

Все элементы <author>, которые содержат хотя бы один элемент <degree> или <award> и хотя бы один элемент <publication>.

Логическое НЕТ

Логический оператор not возвращает отрицание значения выражения внутри шаблона фильтра.

ms256081.collapse_all(ru-ru,VS.120).gifПримеры

Выражение

Ссылается на

author[degree and not(publication)]

Все элементы <author>, которые содержат хотя бы один элемент <degree>, но не содержат ни одного элемента <publication>.

author[not(degree or award) and publication]

Все элементы <author>, которые содержат хотя бы один элемент <publication>, но не содержат ни элементов <degree>, ни элементов <award>.

ms256081.collapse_all(ru-ru,VS.120).gifПример

ms256081.collapse_all(ru-ru,VS.120).gifXML-файл (test.xml)

<?xml version="1.0"?>
<test>

    <x a="1">
      <x a="2" b="B">
        <x>
          <y>y31</y>
          <y>y32</y>
        </x>
      </x>
    </x>

    <x a="2">
      <y>y2</y>
    </x>

    <x a="3">
      <y>y3</y>
    </x>

</test>

ms256081.collapse_all(ru-ru,VS.120).gifXSLT-файл (test.xsl)

Следующая таблица стилей XSLT выбирает все элементы <x> , не имеющие атрибутов.

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<!-- suppress text nodes not covered in subsequent template rule -->
<xsl:template match="text()"/>

<xsl:template match="*">
   <xsl:element name="{name()}">
      <xsl:apply-templates select="*|@*"/>
      <xsl:if test="text()">
         <xsl:value-of select="."/>
      </xsl:if>
   </xsl:element>
</xsl:template>

<xsl:template match="@*">
   <xsl:attribute name="{name()}">
      <xsl:value-of select="."/>
   </xsl:attribute>
</xsl:template>

<xsl:template match="/test">
  <xsl:apply-templates select="//x[not(@*)] "/>
</xsl:template>

</xsl:stylesheet>

ms256081.collapse_all(ru-ru,VS.120).gifВывод

Это преобразование, примененное к описанному выше XML-файлу, дает следующий результат.

<x>
   <y>y31</y>
   <y>y32</y>
</x>