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.