2012-01-27 35 views
6

Có thể bất kỳ ai vui lòng cung cấp biểu thức XPath chọn tất cả các nút có thuộc tính 'xmlns' rõ ràng, ví dụ: <html xmlns="http://www.w3.org/1999/xhtml">? //*[@xmlns] không hoạt động vì (khi nó bật ra) xmlns không được coi là thuộc tính của XPath.XPath: chọn các nút có thuộc tính 'xmlns' rõ ràng

<!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"/> 
....... 

Tôi chỉ cần nút 'html' ở đây.

+0

Có thể. Đây là câu trả lời: http://stackoverflow.com/a/3616018/1115187 – maxkoryukov

Trả lời

9

Câu trả lời về mặt kỹ thuật đúng là nó ...

Không thể. Bạn cần phải phân biệt giữa tài liệu trừu tượng mà văn bản gốc đại diện và bản thân văn bản nguồn thực sự. XPath hoạt động trên trừu tượng, không phải trên văn bản nguồn và địa chỉ của thuộc tính giả xmlns chỉ có liên quan trong phần sau.

Tuy nhiên ...

Bạn có thể loại giả nó với XPath 2.0 biểu thức sau đây:

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

này sẽ chọn bất kỳ yếu tố mà không có một tổ tiên trong không gian tên tương tự, trong đó về mặt lý thuyết có nghĩa là nó chọn tất cả các phần tử trong đó không gian tên được khai báo. Tuy nhiên, nó sẽ không bắt các không gian tên được khai báo lại. Ví dụ, hãy xem xét tài liệu này:

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

Các biểu thức trên chọn html phần tử và các p đầu tiên. Thứ hai p có tổ tiên trong cùng một không gian tên, do đó, nó không được chọn, mặc dù nó chỉ định một xmlns.

3

này không phải là có thể, bởi vì

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

tương đương với

<a xmlns="http://www.org/1"> <b xmlns="http://www.org/1"/> </a> 
Các vấn đề liên quan