Сравнения

Чтобы сравнить два объекта XPath, используйте символ = для проверки равенства или символ != для проверки неравенства.

Для операций сравнения необходимо использовать именно два операнда. Сравнения выполняются путем оценки каждого операнда и при необходимости их преобразования в одинаковый тип. Это выполняется в соответствии с процессом, описанным ниже в разделе «Очередность выполнения для сравнений».

Все элементы и атрибуты являются строками, но они автоматически приводятся к целочисленным значениям при сравнении чисел. В ходе операций сравнения литеральные числовые значения приводятся к типам long или double, как показано в следующей таблице.

Дополнительные сведения о < и других двоичных операторах сравнения см. в разделе «Двоичные операторы сравнения» ниже.

Тип литерала Сравнение Пример

String

text(lvalue) op text(rvalue)

a < GGG

Integer

(long) lvalue op (long) rvalue

a < 3

Real

(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.

Очередность выполнения для сравнений

Сравнения подчиняются очередности выполнения по типам данным.

  • Если хотя бы один операнд является логическим, каждый операнд сначала преобразуется в логическое значение.

  • В противном случае, если хотя бы один операнд является числовым, каждый операнд сначала преобразуется в числовое значение.

  • В противном случае, если хотя бы один операнд является датой, каждый операнд сначала преобразуется в дату.

  • В противном случае оба операнда сначала преобразуются в строковые значения.

Двоичные операторы сравнения

Набор двоичных операторов сравнения сравнивает числовые значения и возвращает логические результаты. Операторы &lt;, &lt;=, &gt; и &gt;= используются соответственно для обозначения логического «меньше чем», «меньше или равно», «больше чем» и «больше или равно». В качестве разделителей строковых значений в выражениях можно использовать одинарные или двойные кавычки. Это облегчает конструирование и передачу шаблонов в языках сценариев.

Обратите внимание, что эти операторы сравнения работают только с численными значениями. Можно сравнивать строки на предмет равенства, но, если нужно сравнить строки для того, чтобы определить, которая из них стоит раньше в порядке сортировки, необходимо использовать функции Функция расширений XPath (Майкрософт).

Примеры

Выражение Ссылается на

author[last-name = "Bob" and price &gt; 50]

Все элементы <author>, содержащие элемент <last-name> со значением Bob и элемент <price> со значением больше 50.

degree[@from != "Harvard"]

Все элементы <degree> с атрибутом from, не равным "Harvard".

book[position() &lt;= 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>

См. также

Справочник

Примеры XPath

Понятия

Образец XML-файла с синтаксисом XPath (inventory.xml)