Заказ результатов запроса XPath

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

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

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

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

Viper Codepad:

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

Моя машина:

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

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

Редактировать:

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

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

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

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

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

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

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

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

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

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

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

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