我正在使用Nokogiri。用於深度嵌套元素的XPath?
假設我有一個深度嵌套的路徑:
//h1/h2/h3/h4/h5
我想我可以使用以下路徑:
//h1/*/*/*/h5
有沒有什麼辦法可以儘量避免使用多個星號?像//h1/.../h5
?
我不想繼續計算嵌套的級別。
我正在使用Nokogiri。用於深度嵌套元素的XPath?
假設我有一個深度嵌套的路徑:
//h1/h2/h3/h4/h5
我想我可以使用以下路徑:
//h1/*/*/*/h5
有沒有什麼辦法可以儘量避免使用多個星號?像//h1/.../h5
?
我不想繼續計算嵌套的級別。
只是使用://
,即://h5
。此XPath將選擇所有h5
元素。見規格表:http://www.w3.org/TR/xpath/#path-abbrev
對於從H1使用降序所有H5元素:
//h1//h5
或者,你可能會喜歡簡單的CSS樣式:
h1 h5
如果您想選擇所有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
祖先的距離比想要的更遠。
您是否需要任何/所有'h5'標籤或者您是否需要HTML中的特定標籤?如果你需要一個特定的,你是否有'h5'的ID或CLASS來幫助你導航到它,或者是一個特定的可以用作地標的特定的東西? –
儘管pguardiario的回答是正確的,但是正如Tin Man所暗示的那樣,最有可能有更好的方法來針對您正在尋找的元素。 –
@TheTinMan馬克托馬斯 - 我忘了這個問題 - 對此感到遺憾。問題是我有一個h5如圖所示,另一個h5在另一個梯隊。現在pguardiario的答案對我來說非常好。我稍後再更新。謝謝你的幫助 – nilanjan