По другому вопросу я создал некоторый код, связанный с 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 каждый возвращал результаты в порядке глубины.