simplexmlelement registerxpathnamespace query namespace name php xpath domdocument libxml2

php - registerxpathnamespace - Orden de resultados de consultas XPath



simplexmlelement::xpath(): undefined namespace prefix (5)

Parece que Viper Codepad no devuelve los nodos de text() seleccionados text() en primer orden de documentos en profundidad, sino que realiza una primera evaluación de amplitud.

Se supone que es un primer recorrido profundo.

Saxon, MSXML y Altova XML devolvieron los resultados en un orden de profundidad en primer lugar.

Para otra pregunta , he creado un código relacionado con XML que funciona en mi máquina de desarrollo pero no en el teclado de viper, donde lo probé antes de agregarlo a mi respuesta.

Podría reducir mi problema hasta el punto en que el orden de los nodos devueltos por DOMXPath::query() difiera entre mi sistema y el teclado.

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

Cuando consulto todos los nodos de //child::text() el resultado es diferente:

Viper Codepad:

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

Mi máquina:

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

No soy tan experimentado con xpath que entiendo por qué sucede esto y cómo es posible que influya en la orden de devolución con la implementación de PHP.

Editar:

Pruebas adicionales revelaron que LIBXML_VERSION difiere entre los dos sistemas:

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


Parece un error en la versión 20626:

Primero procesa todos los nodos de texto secundarios en orden de documento, luego el contenido de los nodos de elementos secundarios. Debe ser el resultado en su máquina



Técnicamente, XPath 1.0 devuelve conjuntos de nodos en lugar de secuencias de nodos. En la especificación XPath 1.0 no hay ninguna declaración sobre el orden de estos conjuntos de nodos; de hecho, al ser conjuntos, no tienen un orden intrínseco.

Sin embargo, XSLT 1.0 siempre procesa los conjuntos de nodos devueltos por XPath 1.0 en orden de documento, y debido a ese precedente, existe una expectativa generalizada de que los resultados de XPath estarán en orden de documento cuando se invoque XPath desde otros lenguajes además de XSLT. Sin embargo, no hay nada en la especificación que garantice esto. En XPath 2.0, la expectativa del usuario se convierte en parte de la especificación, y los resultados de una expresión de ruta DEBEN estar en orden de documento.


XPath es un lenguaje de consulta, por lo tanto, solo debe leer la estructura del documento .xml como está y nunca modificarlo. Esto incluye el orden de nodo. En su primer ejemplo, sin embargo, esto no es cierto. Entonces esto definitivamente es un error de acuerdo a esto .