Главная » XSLT » Сравнение узлов

0

Задача

Требуется идентифицировать узлы или сравнить их на основе позиции в до­кументе.

Решение

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. Примеры см. в рецепте 6.2.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии