Почему xPath возвращает эти элементы в обратном порядке? - PullRequest
0 голосов
/ 22 апреля 2020

Может кто-нибудь сказать мне, почему приведенное ниже выражение xPath приводит к тому, что массив находится в обратном порядке?

/ReaderDetails/Reader[Pin = "2325" or Pin = "2421" or Pin = "2424"]

Когда я затем выполняю foreach, возвращаемый массив извлекает элемент для Сначала 2424, затем 2421 и последний 2325.

Эти ПИН-коды вводятся в списке через запятую и должны быть в этом порядке.

1 Ответ

1 голос
/ 22 апреля 2020

Если вы находитесь в XPath 1.0 (и я полагаю, что это так, потому что люди, использующие более поздние версии, обычно упоминают этот факт), то в соответствии с XPath spe c, результатом будет набор узлов и набор узлов буквально набор узлов без определенного порядка. Однако все известные мне реализации возвращают результаты набора узлов в порядке документа, потому что именно так XSLT требует их, и большинство реализаций XPath разработаны с использованием XSLT в качестве важного варианта использования. Таким образом, Reader элементы, вероятно, будут возвращены в том порядке, в котором они встречаются при сканировании документа в прямом направлении.

В XPath 3.1 вы можете вернуть последовательность узлов в выбранном порядке, написав

/ReaderDetails ! (Reader[Pin = "2325"], 
                  Reader[Pin = "2421"], 
                  Reader[Pin = "2424"])

или, возможно, (если требуемый заказ всегда «отсортирован по номеру пин-кода»),

   sort(/ReaderDetails/Reader[Pin = ('2325', '2421', '2424'), (),
        function($r) {number($r!Pin}) 

, но для этого вам потребуется установить другой движок XPath, например Saxon / C.

Невозможно вернуть последовательность узлов в не-порядке документов в XPath 1.0, поскольку такого типа данных нет. Единственный тип данных коллекции в XPath 1.0 - это набор узлов, который, как я упоминал, не имеет предписанного порядка. Поэтому ваш единственный вариант с XPath 1.0 - извлекать узлы по одному, используя отдельные выражения XPath, или, возможно, сортировать узлы в вызывающем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...