2012-11-01 30 views
5

Tôi đang sử dụng Nokogiri.XPath cho các yếu tố lồng nhau sâu?

Giả sử tôi có một con đường sâu lồng nhau:

//h1/h2/h3/h4/h5 

Tôi nghĩ rằng tôi có thể sử dụng đường dẫn sau:

//h1/*/*/*/h5 

Có cách nào tôi có thể tránh sử dụng nhiều dấu sao? Một cái gì đó như //h1/.../h5?

Tôi không muốn tiếp tục đếm mức độ lồng nhau.

+0

Bạn có cần bất kỳ/tất cả thẻ 'h5' hoặc bạn có cần một thẻ cụ thể trong HTML không? Nếu bạn cần một cái cụ thể, bạn có một ID hoặc CLASS cho 'h5' sẽ giúp bạn điều hướng đến nó, hoặc một cái gì đó cụ thể về một cái cụ thể có thể được sử dụng làm một mốc? –

+0

Trong khi câu trả lời của pguardiario là đúng cho cách bạn đóng khung câu hỏi của bạn, như Tin Man gợi ý, có nhiều khả năng một cách tốt hơn để nhắm mục tiêu cụ thể (các) thành phần bạn đang tìm kiếm. –

+0

@ theTinMan Mark Thomas - tôi quên câu hỏi này - xin lỗi về điều đó. Vấn đề là tôi có một h5 như được hiển thị và một h5 khác trong chế độ thừa kế khác. Bây giờ, câu trả lời của pguardiario rất tốt cho tôi. Tôi sẽ cập nhật sau. Cảm ơn bạn đã giúp đỡ – nilanjan

Trả lời

8

cho tất cả các yếu tố h5 mà xuống từ việc sử dụng h1:

//h1//h5 

Hoặc bạn có thể thích phong cách css đơn giản:

h1 h5 
2

Nếu bạn muốn chọn tất cả h5 chính xác là 4 cấp dưới tổ tiên h1 của chúng, sử dụng:

//h5[ancestor::*[4][self::h1]] 

XSLT - dựa xác minh:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="//h5[ancestor::*[4][self::h1]]"/> 
</xsl:template> 
</xsl:stylesheet> 

Khi chuyển đổi này được áp dụng trên các tài liệu sau đây XML:

<t> 
<head/> 
<body> 
    <h1>First Main title 
    <a> 
    <b> 
     <c> 
     <h5 id="id1"/> 
     <d> 
      <h5 id="id2"/> 
     </d> 
     </c> 
    </b> 
    </a> 
    </h1> 
</body> 
</t> 

biểu thức XPath được đánh giá và kết quả của việc đánh giá (các phần tử h1 được chọn (trong trường hợp này chỉ là một)) được sao chép vào đầu ra:

<h5 id="id1"/> 

Nếu bạn không muốn đếm số lượng các cấp trung gian, Butare chắn rằng họ không vượt quá một số lượng nhất định (ví dụ 7), bạn có thể viết:

//h1[descendent::*[not(position() > 7)][self::h1]] 

Tùy chọn này chọn bất kỳ h5 hậu duệ của bất kỳ h1 nào, trong đó "khoảng cách" ở các mức giữa h1 và hậu duệ h5 không vượt quá 7.

Do lưu ý:

Một biểu hiện như dưới đây - như đề xuất trong câu trả lời khác:

//h1//h5 

sai lựa chọn cho các tài liệu trên:

<h5 id="id1"/> 
<h5 id="id2"/> 

Phần thứ hai trong số hai phần tử được chọn h5 có khoảng cách lớn hơn khoảng cách mong muốn từ tổ tiên h1 tổ tiên của nó.

Các vấn đề liên quan