2012-11-01 14 views
5

Używam Nokogiri.XPath dla głęboko zagnieżdżonych elementów?

Załóżmy, że mam głęboko zagnieżdżony ścieżkę:

//h1/h2/h3/h4/h5 

myślę, że mogę korzystać z następującą ścieżkę:

//h1/*/*/*/h5 

Czy jest jakiś sposób mogę uniknąć używania wielu gwiazdki? Coś takiego jak //h1/.../h5?

Nie chcę dalej liczyć poziomów zagnieżdżania.

+0

Czy potrzebujesz wszystkich/wszystkich znaczników 'h5' lub potrzebujesz konkretnego w HTML? Jeśli potrzebujesz konkretnego, czy posiadasz ID lub CLASS dla 'h5', które pomogłyby ci przejść do niego, lub coś konkretnego na temat konkretnego, który może być użyty jako punkt orientacyjny? –

+0

Podczas gdy odpowiedź pguardiario jest poprawna, biorąc pod uwagę sposób, w jaki sformułowałeś swoje pytanie, jak sugeruje Tin Man, najprawdopodobniej jest lepszy sposób na celowanie w konkretny element, którego szukasz. –

+0

@tinMan Mark Thomas - zapomniałem o tym pytaniu - przepraszam za to. Problem polegał na tym, że mam jedno h5, jak pokazano, i kolejne h5 w innej heirarchii. Na razie odpowiedź pguardiario jest dla mnie bardzo dobra. Zaktualizuję później. Dzięki za pomoc – nilanjan

Odpowiedz

8

dla wszystkich elementów H5, które schodzą z użytku H1:

//h1//h5 

Albo może chcesz prostszy styl CSS:

h1 h5 
2

Jeśli chcesz wybrać wszystkie h5 które są dokładnie 4 poziomy poniżej ich przodka h1, użyj:

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

XSLT - na podstawie weryfikacji:

<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> 

Kiedy transformacja ta jest stosowana na poniższym dokumencie 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> 

wyrażenie XPath jest oceniane i wyniku oceny (wybrane elementy h1 (w tym przypadku tylko jeden)) są kopiowane na wyjście:

<h5 id="id1"/> 

Jeśli nie chcesz, aby policzyć liczbę poziomów pośrednich, Butare pewność, że nie przekraczają one pewną liczbę (powiedzmy 7), można napisać:

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

To wybiera dowolnego potomka h5 dowolnego z h1, gdzie "odległość" w poziomach pomiędzy h1 i potomkiem h5 nie przekracza 7.

Należy pamiętać:

Wyrażenie jak poniżej - jak zasugerowano w innych odpowiedzi:

//h1//h5 

nieprawidłowo wybiera dla powyższego dokumentu:

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

Drugi z dwóch wybranych elementów znajduje się w większej odległości od żądanego elementu od swojego przodka.

Powiązane problemy