2012-01-27 3 views
6

Может ли кто-нибудь указать выражение XPath, которое выбирает все узлы с явным атрибутом «xmlns», например. <html xmlns="http://www.w3.org/1999/xhtml">? //*[@xmlns] не работает, потому что (как оказалось) xmlns не рассматривается как атрибут XPath.XPath: выберите узлы с явным атрибутом «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"/> 
....... 

Мне нужен только 'html' узел здесь.

+0

Возможно. Вот ответ: http://stackoverflow.com/a/3616018/1115187 – maxkoryukov

ответ

9

Технически правильный ответ, что это ...

Не возможно. Вам нужно различать абстрактный документ, который представляет исходный текст, и собственно текст исходного текста. XPath работает с абстракцией, а не с исходным текстом, а - псевдокаталога xmlns применим только к последнему.

Однако ...

Вы могли бы вроде фальшивый со следующим XPath 2.0 выражения:

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

Это выбирает любой элемент, который не имеет предка в том же пространстве имен, что теоретически означает, что он выбирает все элементы, в которых объявлено пространство имен. Однако он не будет перехватывать пространства имен, которые будут повторно объявлены. Например, рассмотрим этот документ:

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

Выражение выше выбирает html элемент и первый p. Второй p имеет предка в том же пространстве имен, поэтому он не выбран, хотя он указывает xmlns.

3

Это не должно быть возможным, потому что

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

эквивалентно

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