Сравнение узлов¶
Задача¶
Требуется идентифицировать узлы или сравнить их на основе позиции в документе.
Решение¶
XPath 1.0¶
В следующих примерах предполагается, что $x и $y содержат по одному узлу из одного и того же документа. Напомним также, что порядок документа – это тот порядок, в котором узлы следуют в документе.
Проверить, представляют ли переменные $x и $y один и тот же узел: generate-id($x) = generate-id($y)
Можно также воспользоваться тем фактом, что оператор | удаляет дубликаты: count($x|$y) = 1
Проверить, что $x предшествует $y в порядке документа. Отметим, что этот способ не работает, если $x или $y - атрибут: count(($x/preceding::node()) < count(($y/preceding::node()) or $x = $y/ancestor::node()
Проверить, что $x следует за $y в порядке документа. Отметим, что этот способ не работает, если $x или $y – атрибут: count(($x/following::node()) < count(($y/following::node()) or $x = $y/ancestor::node()
XPath 2.0¶
Проверить, представляют ли переменные $x и $y один и тот же узел: $x is $y
Проверить, что $x предшествует $y в порядке документа: $x << $y
Проверить, что $x следует за $y в порядке документа: $x >> $y
Обсуждение¶
Появившиеся в XPath 2.0 операторы сравнения узлов работают более эффективно и проще для понимания, чем конструкции из XPath 1.0. Однако при работе с XPath 2.0 ситуации, когда в этих операторах возникает необходимость, встречаются не так уж часто. Обычно, когда вам кажется, что нужно бы воспользоваться оператором << или >>, задачу проще решить с помощью предложения xsl::for-each-group.