Сравнения (XPath)
Чтобы сравнить два объекта XPath, используйте символ = для проверки равенства или символ != для проверки неравенства.
Для операций сравнения необходимо использовать только два операнда. Сравнения выполняются путем оценки каждого операнда и при необходимости их преобразования в одинаковый тип. Это выполняется в соответствии с процессом, описанным ниже в разделе «Очередность выполнения для сравнений».
Все элементы и атрибуты являются строками, но они автоматически приводятся к целочисленным значениям при сравнении чисел. В ходе операций сравнения литеральные числовые значения приводятся к длинным или двойным типам, как показано в следующей таблице.
Дополнительные сведения о < и других бинарных операторах сравнения см. в разделе «Бинарные операторы сравнения» ниже.
Литеральный тип |
Сравнение |
Пример |
---|---|---|
Строка |
text(lvalue) op text(rvalue) |
a < GGG |
Целое число |
(long) lvalue op (long) rvalue |
a < 3 |
Вещественное число |
(double) lvalue op (double) rvalue |
a < 3.1 |
Одинарные или двойные кавычки используются для разделителей строк в выражениях. Это облегчает конструирование и передачу шаблонов в языках скриптов.
Дополнительные сведения о выполнении сравнений с помощью языка XPath см. в разделе 3.4 («Логические значения») в документе «Язык XPath версии 1.0 (рекомендации консорциума W3C от 16 ноября 1999 г.)» по адресу www.w3.org/TR/xpath.
Примеры
Выражение |
Ссылается на |
---|---|
author[last-name = "Bob"] |
Все элементы <author>, содержащие хотя бы один элемент <last-name> со значением Bob. |
author[last-name[1] = "Bob"] |
Все элементы <author>, чей первый дочерний элемент <last-name> имеет значение Bob. |
author/degree[@from != "Harvard"] |
Все элементы <author>, содержащие элементы <degree> с атрибутом from, не равным значению "Harvard". |
author[last-name = /editor/last-name] |
Все элементы <author>, содержащие элемент <last-name>, совпадающий с элементом <last-name> внутри элемента <editor> под корневым элементом. |
author[. = "Matthew Bob"] |
Все элементы <author>, имеющие строковое значение Matthew Bob. |
Очередность выполнения для сравнений
Сравнения подчиняются очередности выполнения по типам данным.
Если хотя бы один операнд является логическим, каждый операнд сначала преобразуется в логическое значение.
В противном случае, если хотя бы один операнд является числовым, каждый операнд сначала преобразуется в числовое значение.
В противном случае, если хотя бы один операнд является датой, каждый операнд сначала преобразуется в дату.
В противном случае оба операнда сначала преобразуются в строковые значения.
Двоичные операторы сравнения
Набор двоичных операторов сравнения сравнивает числовые значения и возвращает логические результаты. Операторы <, <=, > и >= используются соответственно для обозначения логического «меньше чем», «меньше или равно», «больше чем» и «больше или равно». Одинарные или двойные кавычки используются для разделителей строк в выражениях. Это облегчает конструирование и передачу шаблонов в языках скриптов.
Обратите внимание, что эти операторы сравнения работают только с численными значениями. Можно сравнивать строки на предмет равенства, но, если нужно сравнить строки для того, чтобы определить, которая из них стоит раньше в порядке сортировки, необходимо использовать функции Функции расширения Microsoft XPath.
Примеры
Выражение |
Ссылается на |
---|---|
author[last-name = "Bob" and price > 50] |
Все элементы <author>, содержащие элемент <last-name> со значением Bob и элемент <price> со значением больше 50. |
degree[@from != "Harvard"] |
Все элементы <degree> с атрибутом from, не равным "Harvard". |
book[position() <= 3] |
Первые три (1, 2, 3) элемента <book> в XML-файле. |
Пример
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[position() = 1 ] "/>
</xsl:template>
</xsl:stylesheet>
Форматированный вывод
Преобразование, примененное к указанному выше XML-файлу, выдает следующий результат.
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>