tutorial online herramienta ejemplos consultas xml xpath xquery

xml - online - xpath list of elements



Usando XPath, ¿cómo selecciono un nodo en función de su contenido de texto y el valor de un atributo? (2)

Aparte del problema "//", este XML es un uso muy extraño de contenido mixto. El text()=''July'' predicado text()=''July'' coincidirá con el elemento si cualquier nodo de texto hijo es exactamente igual a julio, lo cual no es cierto en su ejemplo debido a los espacios en blanco que lo rodean. Dependiendo de la definición exacta de la fuente XML, iría por [text()[normalize-space(.)=''July''] and Quad/P1/@X > 90]

Dado este XML:

<DocText> <WithQuads> <Page pageNumber="3"> <Word> July <Quad> <P1 X="84" Y="711.25" /> <P2 X="102.062" Y="711.25" /> <P3 X="102.062" Y="723.658" /> <P4 X="84.0" Y="723.658" /> </Quad> </Word> <Word> </Word> <Word> 30, <Quad> <P1 X="104.812" Y="711.25" /> <P2 X="118.562" Y="711.25" /> <P3 X="118.562" Y="723.658" /> <P4 X="104.812" Y="723.658" /> </Quad> </Word> </Page> </WithQuads>

Me gustaría encontrar los nodos que tienen el texto de ''Julio'' y un atributo Quad / P1 / X mayor que 90. Por lo tanto, en este caso, no debería devolver ninguna coincidencia. Sin embargo, si utilizo GT (>) o LT (<), obtengo una coincidencia en el primer elemento de Word. Si uso eq (=), no obtengo ninguna coincidencia.

Asi que:

//Word[text()=''July'' and //P1[@X < 90]]

volverá verdadero, como lo hará

//Word[text()=''July'' and //P1[@X > 90]]

¿Cómo puedo restringir esto correctamente en el atributo P1 @ X?

Además, imagine que tengo múltiples elementos de página para diferentes números de página. ¿Cómo puedo restringir adicionalmente la búsqueda anterior para encontrar nodos con text()=''July'', P1@X < 90 y Página @pageNumber=3 ?


En general, consideraría el uso de un // no prefijado como un mal olor en un XPath.

Prueba esto:-

/DocText/WithQuads/Page/Word[text()=''July'' and Quad/P1/@X > 90]

Su problema es que usa //P1[@X < 90] que comienza de nuevo al comienzo del documento y comienza a buscar cualquier P1 por lo que siempre será cierto. Del mismo modo //P1[@X > 90] siempre es verdadero.