2009-10-10 14 views
18

consideran dos tipos:Xpath: cómo seleccionar una opción en función de su propiedad de texto sin valor?

<select name="garden"> 
    <option>Flowers</option> 
    <option selected="selected">Shrubs</option> 
    <option>Trees</option> 
    <option selected="selected">Bushes</option> 
    <option>Grass</option> 
    <option>Dirt</option> 
</select> 

¿Es @val para indicar realmente el atributo value=""?

¿Está @value indicando el valor de texto interno?

por ejemplo, qué ocurre si <option> no contiene ninguna propiedad value="". ¿cómo lo seleccionarías entonces?

select/option[@value = "Grass"] 

¿Xpath automáticamente ignora los espacios en blanco para el caso de arriba? ¿Debería ser recortado?

EDIT:

para seleccionar múltiples opciones bastaría esto?

select/option[normalize-space(text())="Grass" or normalize-space(text())="Trees"] 

Respuesta

24

Para seleccionar por valor de texto puede utilizar text() función. Y es necesario normalizar los espacios, ya que no se eliminan por defecto. Aquí está un ejemplo:

select/option[normalize-space(text())="Grass"] 

@value - valor del atributo "value"

@val - valor de "val" atributo

normalize-space() - función devuelve la cadena de argumentos con espacios en blanco normalizado mediante la eliminación de ataque y trazando espacios en blanco y reemplazando secuencias de caracteres en espacios en blanco por un espacio simple

+0

para seleccionar múltiples opciones ¿Sería suficiente? select/option [normalize-space (text()) = "Grass" o normalize-space (text()) = "Trees"] – h34y

+0

Sí, devolverá ambos nodos –

+0

Está bien, excepto ese 'text () 'no es una función. Es una prueba de nodo. Y la respuesta de Marc es más corta y más idiomática para XPath. –

11

Bueno, si los espacios en blanco no es un problema:

/select/option[.='Grass'] 

que había necesidad de comprobar re espacios en blanco, sin embargo. Siempre se puede normalizar:

/select/option[normalize-space(.)='Grass'] 
+0

para seleccionar múltiples opciones ¿Sería suficiente? select/option [normalize-space (.) = "Grass" o normalize-space (.) = "Trees"] – h34y

+0

Claro - eso funcionaría –

+0

Esto parece ser sensible a mayúsculas y minúsculas. ¿Hay alguna manera de hacer esto de otra manera? – Tatarin

Cuestiones relacionadas