2011-04-01 7 views
5

Esto funciona muy bien para encontrar elementos HTML de botones que se simplificados (a propósito):¿Hay una expresión DRYer XPath para la unión?

//button[text()='Buy'] 
| //input[@type='submit' and @value='Buy'] 
| //a/img[@title='Buy'] 

ahora tengo que limitar a un contexto. Por ejemplo, el botón Comprar que aparece dentro de un cuadro con la etiqueta:

//legend[text()='Flubber'] 

Y esto funciona, (.. nos lleva al conjunto de campos que contiene):

//legend[text()='Flubber']/..//button[text()='Buy'] 
| //legend[text()='Flubber']/..//input[@type='submit' and @value='Buy'] 
| //legend[text()='Flubber']/..//a/img[@title='Buy'] 

Pero ¿hay alguna manera de simplificar este ? Lamentablemente, este tipo de cosas no funciona:

//legend[text()='Flubber']/..//(
    button[text()='Buy'] 
| input[@type='submit' and @value='Buy'] 
| a/img[@title='Buy']) 

(Tenga en cuenta que esto es para XPath dentro del navegador, por lo que las soluciones XSLT no ayudará.)

Respuesta

2

de:

Ajuste ligeramente para obtener el Un lugar de la IMG: self::a[img[@title='Buy']]. (Ahora bien, si sólo se 'Comprar' podría reducirse

Utilice esta XPath 1.0 expresión:

//legend[text() = 'Flubber']/.. 
    //*[ 
     self::button/text() 
    | self::input[@type = 'submit']/@value 
    | self::a/img/@title 
    = 'Buy' 
    ] 

EDITAR:. No vi el descriptor de acceso de los padres La otra manera en una sola dirección:

//*[legend[text() = 'Flubber']] 
    //*[ 
     self::button/text() 
    | self::input[@type = 'submit']/@value 
    | self::a/img/@title 
    = 'Buy' 
    ] 
+0

, esto compara s la concatenación de los 3 valores, que debería funcionar en este ejemplo simplificado con partes mutuamente excluyentes. Es interesante cómo mi problema original es el uso torpe del operador de la unión, y este refinamiento es el uso sutil de la unión. –

+1

@Chris Noe: Esta comparación de conjunto de nodos de uso (no "concatenación") y esas rutas relativas dentro del último predicado son mutuamente excluyentes por sí mismas porque todas comienzan con el eje propio: trabajarán con cualquier documento, ya sea simple o complejo. –

+0

Sí, esto abre nuevos horizontes. ¡Gracias! –

3

combinar varias condiciones en un solo predicado:

//legend[text()='Flubber']/..//*[self::button[text()='Buy'] or 
           self::input[@type='submit' and @value='Buy'] or 
           self::img[@title='Buy'][parent::a]] 

En Inglés:

Seleccionar todos los descendientes de los padres (o el propio padre) para cualquier elemento legend tener la texto "Flubber" que son cualquiera de 1) un elemento button tener el texto "comprar" o 2) un elemento input tener un atributo type cuyo valor es "enviar" y un atributo llamado value cuyo valor es "Comprar" o 3) un img que tiene un atributo llamado title con un valor de "comprar" y cuyo padre es un elemento a .

+0

Muy buen ajuste ligeramente para obtener el a en lugar de la IMG:.. :: sí un [img [@ title = 'Comprar']] (Ahora sólo falta 'Comprar' se podrían reducir :) Hmm –

Cuestiones relacionadas