2009-07-01 31 views
30

Sé que esta es una pregunta simple, pero no puedo resolverlo. Considere el siguiente documento XML simple:Excluir ciertos elementos de la selección en XPath

<root> 
    <a></a> 
    <b></b> 
    <c></c> 
    <a></a> 
    <d></d> 
    <e></e> 
    <a></a> 
    <a></a> 
</root> 

¿Cuál es la mejor manera de seleccionar los nodos a través <b><e> usando XPath?

Busco algo así como

/root/*[not(a)] 

(que no hacer el truco)

+5

¿qué tal si excluimos más de un elemento? Me he enterado, está usando select = "* [not (self :: abc)] [not (self :: def)]" – lwpro2

+0

esto también debería funcionar para excluir más de un elemento [no (abc o def)] – novice

Respuesta

50
/root/*[not(self::a)] 
+0

Esto también funciona cuando se usa XPointer y XInclude. –

-2

Ha intentado:

/root/b |/root/c | root/d |/root/e

+4

Así es como lo tuve implementado. Desafortunadamente, puede haber otros nodos con nombres desconocidos – user123444555621

6

comprendo que esto es una vieja pregunta, pero recientemente me encontré con un problema similar y se utiliza la siguiente XPath para resolverlo:

/root/*[not(name()='a')] 
7

Respondiendo a añadir que en XPath 2.0, puede utilizar except:

/root/(* except a) 

Para XPath 1.0, Tomalak señalado, esto es la forma estándar de hacerlo:

/root/*[not(self::a)] 

Por cierto, si alguien aterriza aquí tratando de utilizar esto en XSLT 2.0 en un xsl:template/@match atributo que no funcionará porque @match toma patrones que si bien mira como expresiones XPath, son no expresiones XPath. La solución para XPath 1.0 funcionaría en este caso.

Cuestiones relacionadas