Порядок результатов запроса XPath - PullRequest
8 голосов
/ 19 ноября 2011

Для другой вопрос Я создал некоторый связанный с XML код, который работает на моей машине для разработки, но не на кодовой панели viper, где я тестировал его перед добавлением в свой ответ.

Я мог бы свести мою проблему до такой степени, что порядок узлов, возвращаемых DOMXPath::query(), отличается между моей системой и кодовой панелью.

XML: <test>This is some <span>text</span>, fine.</test>

Когда я запрашиваю все текстовые узлы //child::text() результат отличается:

Кодовая панель Viper:

#0: This is some 
#1: , fine.
#2: text

Моя машина:

#0: This is some 
#1: text
#2: , fine.

Я не настолько опытен с xpath, что понимаю, почему это происходит и как, возможно, возможно повлиять на порядок возврата при реализации PHP.

Edit:

Дальнейшие испытания показали, что LIBXML_VERSION отличается между двумя системами:

Viper Codepad: 20626 (2.6.26; 6 Jun 2006)
My Machine...: 20707 (2.7.7; 15 Mar 2010)

Ответы [ 5 ]

7 голосов
/ 20 ноября 2011

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

Однако XSLT 1.0 всегда обрабатывает наборы узлов, возвращаемые XPath 1.0 впорядок документов, и из-за этого прецедента широко распространено ожидание, что результаты XPath будут в порядке документов, когда XPath вызывается из языков, отличных от XSLT.Однако в спецификации нет ничего, чтобы гарантировать это.В XPath 2.0 ожидание пользователя становится частью спецификации, и результаты выражения пути ДОЛЖНЫ быть в порядке документа.

4 голосов
/ 19 ноября 2011

Я мог бы найти следующий отчет об ошибке, который выглядит как проблема: Ошибка 363252 - близость позиции в xmlXPathEvalExpression () * libxml2 (*) , опубликованная 18 октября 2006 г. и подтвержденная начиная с мая 2006 г., то есть до версии 2.6.26 рассматриваемая версия.

Это должно быть исправлено в libxml2 2.6.27.

2 голосов
/ 19 ноября 2011

XPath - это язык запросов, поэтому он должен только читать структуру XML-документа как есть и никогда не изменять его.Это включает в себя порядок узлов.Однако в вашем первом примере это не так.Так что это определенно ошибка согласно this .

2 голосов
/ 19 ноября 2011

Это похоже на ошибку в версии 20626:

Сначала обрабатываются все дочерние текстовые узлы в порядке документа, затем содержимое узлов дочерних элементов. Должен быть как результат на вашей машине

1 голос
/ 19 ноября 2011

Похоже, что Viper Codepad не возвращает выбранные text() узлы в порядке глубины в первом документе, а выполняет оценку в ширину.

Предполагается, что это обход в глубину.

Saxon, MSXML, Altova XML каждый возвращал результаты в порядке глубины.

...