2012-06-20 86 views
11

Estoy tratando de seleccionar todos los elementos dom que tienen id="mydiv" pero excluyo los que también tienen el class="exclass". En este momento estoy haciendo la primera parte //*[@id="mydiv"]. ¿Cómo agrego la parte de exclusión de clase?xpath para excluir elementos que tienen una clase

P.S. En caso de que se pregunte por qué necesito seleccionar varios elementos que tienen la misma identificación, estoy trabajando en un DOM existente que no puedo controlar.

+0

¿Tiene varios elementos con la misma identificación? Eso no es saludable, sabes. http://stackoverflow.com/questions/2487074/what-are-the-side-effects-of-using-multiple-instances-of-a-single-id-name-in-htm – jolt

Respuesta

17

Puede utilizar la negación:

//*[@id="mydiv and @class!="exclass"] 

Si el atributo class puede no existir en todos los nodos, es necesario lo siguiente:

//*[@id="mydiv" and (not(@class) or @class!="exclass")] 

El último (un poco) extraña lógica se puede convertir en lo Michael propuso:

//*[@id="mydiv" and not(@class="exclass")] 

Aunque, personalmente, el hecho de que XPath no puede hacer comparaciones ons si falta el atributo se siente un poco como un defecto.

+0

Esto no es lo que el usuario pidió. Downvoting. Ver mi respuesta –

+0

@MichaelKay Gracias por señalarlo, he actualizado mi respuesta; como mencioné en mi actualización, siento que tener un "nada no se puede comparar con nada" es una deficiencia de xpath; simplemente no puedo pensar en ninguna razón por la cual ese comportamiento sería útil:/ –

5

La respuesta a la pregunta escrita es

//*[@id="mydiv" and not(@class="exclass")] 

La primera mitad de la condición es verdadera si hay un atributo @id y su valor es mydiv. La segunda mitad es verdadera si no hay ningún atributo @class con el valor exclass: es decir, si no hay ningún atributo de clase, o si hay un atributo de clase y su valor es algo distinto de "exclass".

Evita el uso! = En esta situación: el 90% del tiempo, si piensas escribir A=B, probablemente querías not(A=B). El significado es diferente en el caso en que A o B no son un singleton, es decir, donde están vacíos o pueden contener múltiples valores.

+0

¡Las reglas de TriXPath (como en los trucos)! – jolt

Cuestiones relacionadas