2012-01-27 7 views
6

¿Podría alguien proporcionar la expresión XPath que selecciona todos los nodos que tienen el atributo explícito 'xmlns', p. <html xmlns="http://www.w3.org/1999/xhtml">? //*[@xmlns] no funciona porque (como se vio) xmlns no es tratado como atributo por XPath.XPath: seleccione nodos con el atributo explícito 'xmlns'

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"/> 
<title>Информация по счетам, картам</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<meta http-equiv="cache-control" content="no-cache"/> 
<meta http-equiv="pragma" content="no-cache"/> 
....... 

Necesito solo 'html' node aquí.

+0

Es posible. Aquí hay una respuesta: http://stackoverflow.com/a/3616018/1115187 – maxkoryukov

Respuesta

9

La respuesta técnicamente correcta es que es ...

No es posible. Debe distinguir entre el documento abstracto que representa el texto original y el texto fuente real. XPath funciona en la abstracción, no en el texto de origen, y la ubicación del pseudoatributo xmlns solo es relevante en este último.

Sin embargo ...

Usted podría especie de fingir con la siguiente expresión XPath 2.0:

//*[not(namespace-uri()=ancestor::*/namespace-uri())] 

Esto selecciona cualquier elemento que no tiene un antepasado en el mismo espacio de nombres, el cual teóricamente significa que selecciona todos los elementos donde se declara el espacio de nombres. Sin embargo, no detectará los espacios de nombres que se vuelven a declarar. Por ejemplo, considere este documento:

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head/> 
    <body> 
     <p xmlns="http://something"> 
      <p xmlns="http://something"/> 
     </p> 
    </body> 
</html> 

La expresión anterior se selecciona el elemento html y la primera p. El segundo p tiene un ancestro en el mismo espacio de nombres, por lo que no está seleccionado, aunque especifica un xmlns.

3

Esto no debería ser posible, porque

<a xmlns="http://www.org/1"> <b/> </a> 

es equivalente a

<a xmlns="http://www.org/1"> <b xmlns="http://www.org/1"/> </a> 
Cuestiones relacionadas