2012-11-01 78 views
5

我正在使用Nokogiri。用於深度嵌套元素的XPath?

假設我有一個深度嵌套的路徑:

//h1/h2/h3/h4/h5 

我想我可以使用以下路徑:

//h1/*/*/*/h5 

有沒有什麼辦法可以儘量避免使用多個星號?像//h1/.../h5

我不想繼續計算嵌套的級別。

+0

您是否需要任何/所有'h5'標籤或者您是否需要HTML中的特定標籤?如果你需要一個特定的,你是否有'h5'的ID或CLASS來幫助你導航到它,或者是一個特定的可以用作地標的特定的東西? –

+0

儘管pguardiario的回答是正確的,但是正如Tin Man所暗示的那樣,最有可能有更好的方法來針對您正在尋找的元素。 –

+0

@TheTinMan馬克托馬斯 - 我忘了這個問題 - 對此感到遺憾。問題是我有一個h5如圖所示,另一個h5在另一個梯隊。現在pguardiario的答案對我來說非常好。我稍後再更新。謝謝你的幫助 – nilanjan

回答

8

對於從H1使用降序所有H5元素:

//h1//h5 

或者,你可能會喜歡簡單的CSS樣式:

h1 h5 
2

如果您想選擇所有h5比它們的h1祖先正好低4級,使用:

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

XSLT - 基於驗證

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

當在下面的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> 

XPath表達式求值和評價的結果(選定的h1元素(在本例中僅爲一個))被複制到輸出

<h5 id="id1"/> 

如果你不想算中等水平的數量,布塔雷確保它們不超過一定數量(比如7),你可以寫

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

這選擇任何h5後代的任何h1,其中h1和後代h5之間的級別「距離」不超過7

待辦事項

像下面的表達式 - 在其他的答案提示:

//h1//h5 

錯誤地選擇用於上述文獻

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

這兩個選中的h5元素中的第二個元素距離其h1祖先的距離比想要的更遠。