2011-11-19 22 views
8

Para another question He creado 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.Orden de resultado de consulta XPath

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

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

Cuando la búsqueda en todos textnodes //child::text() el resultado difiere:

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:

Otras pruebas han revelado que LIBXML_VERSION diferencia entre los dos sistemas:

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

Respuesta

2

Se parece a un error en 20626 Versión:

Procesa primero todo el texto niño nodos en orden de documento, luego contenido de nodos de elemento hijo. Debe ser el resultado en su máquina

+1

Si bien esa es la explicación más probable según Occam, debe haber un informe de error o un indicador en el registro de cambios libxml para verificarlo. – Gordon

+0

¿De dónde obtuviste esa información? Si puede, agregue un enlace a algún recurso oficial, por favor. – hakre

+0

Solo asumí que se trata de un problema, porque xpath genera un orden de nodos incorrecto. Actualmente he encontrado solo [this] (http://mail.gnome.org/archives/xml/2008-November/msg00112.html), pero no está relacionado. Y probablemente [esto] (http://mail.gnome.org/archives/xml/2005-May/msg00035.html) también – Vitaliy

1

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

Se supone que es un primer recorrido de profundidad.

Saxon, MSXML, Altova XML cada uno devolvió los resultados en orden de profundidad.

2

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. Este es definitivamente un error de acuerdo con this.

+0

Sí, eso es lo que también pienso, o al menos cómo entendí el término * Orden de documentos * en la definición de xpath. – hakre

7

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 documentos cuando se invoque XPath desde otros idiomas distintos 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.

+0

+1 para una respuesta correcta e informativa. –

+0

libxml2 sigue la convención por diseño para regresar siempre en orden de documento. Incluso para los atributos, por ejemplo, que no necesitan tener un pedido también. – hakre

+1

@Michael Kay: ¿Qué tal el orden con los predicados? ¿XPath 1.0 no especifica que los conjuntos de nodos están en orden de documento? http://www.w3.org/TR/xpath/#predicates – hakre

Cuestiones relacionadas