Логические выражения, выражения сравнения и выражения набора (XPath)
Шаблоны фильтров могут содержать логические выражения, выражения сравнения и выражения набора. Сочетания клавиш, приведенные в следующей таблице, представляют собой альтернативные символы, предоставляемые данной реализацией файла преобразований XSLT. Эти операторы выражений описаны в настоящем документе.
Оператор |
Описание |
---|---|
and |
Логическое И |
or |
Логическое ИЛИ |
not() |
Отрицание |
= |
Равенство |
!= |
Не равно |
< * |
Меньше |
<= * |
Меньше или равно |
> * |
Больше |
<= * |
Больше или равно |
| |
Операция множества. Возвращает объединение двух множеств узлов |
* Расширенный метод XPath
Согласно рекомендациям консорциума W3C, в конструкциях с ключевыми словами операторов используются пробелы и другие разделители, а не знаки доллара ($), как было в версии 2.5. В синтаксисе W3C бинарное ключевое слово вида $xxx$ можно выразить как wsxxxws,, где ws означает символ-завершитель лексемы, который может быть пробелом, одинарной кавычкой (') или двойной кавычкой ("). С унарными операторами, например not(), используется нотация функций. Реализация Майкрософт поддерживает оба вида конструкций, но для совместимости с будущими версиями рекомендуется использовать синтаксис W3C.
В следующей таблице показан приоритет операций сравнения и логических операций (от высокого к низкому).
Приоритет |
Операторы |
Описание |
---|---|---|
1 |
( ) |
Группирование |
2 |
[ ] |
Фильтры |
3 |
/ // |
Операции с путями |
4 |
< или < <= или <= > или > >= или >= |
Сравнения |
5 |
= != |
Сравнения |
6 |
| |
Объединение |
7 |
not() |
Логическое НЕТ |
8 |
And |
Логическое И |
9 |
Or |
Логическое ИЛИ |
При использовании операторов в XML-документе (например, в таблице стилей XSLT) маркеры < и > нужно экранировать, получая, соответственно, < и >. Например, следующая инструкция XSLT применяет правило шаблона XSLT ко всем элементам <book>, элемент <price> которых имеет численное значение, меньшее или равное 10.
<xsl:apply-templates select="book[price <= 10]"/>
При использовании выражения XPath с моделью DOM нет необходимости экранировать операторы < и >. Например, следующая инструкция JScript выбирает все элементы <book>, элемент <price> которых имеет численное значение, меньшее или равное 10.
var cheap_books = dom.selectNodes("book[price <= 10]");
Логические выражения могут совпадать со всеми узлами, имеющими определенное значение, либо с узлами, имеющими узлы в определенном диапазоне. Ниже приведен пример логического выражения, возвращающего значение false.
1 >= 2
Операторы обрабатываются с учетом регистра.
Логическое «и» и логическое «или»
Логические операторы and и or выполняют операции логического «и» и логического «или» соответственно. Эти операторы и группирующие скобки позволяют строить усложненные логические выражения.
Примеры
Выражение |
Ссылается на |
---|---|
author[degree and award] |
Все элементы <author>, которые содержат хотя бы один элемент <degree> и хотя бы один элемент <award>. |
author[(degree or award) and publication] |
Все элементы <author>, которые содержат хотя бы один элемент <degree> или <award> и хотя бы один элемент <publication>. |
Логическое НЕТ
Логический оператор not возвращает отрицание значения выражения внутри шаблона фильтра.
Примеры
Выражение |
Ссылается на |
---|---|
author[degree and not(publication)] |
Все элементы <author>, которые содержат хотя бы один элемент <degree>, но не содержат ни одного элемента <publication>. |
author[not(degree or award) and publication] |
Все элементы <author>, которые содержат хотя бы один элемент <publication>, но не содержат ни элементов <degree>, ни элементов <award>. |
Пример
XML-файл (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>
XSLT-файл (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>
Вывод
Это преобразование, примененное к описанному выше XML-файлу, дает следующий результат.
<x>
<y>y31</y>
<y>y32</y>
</x>