XPath“跟隨兄弟姐妹之前”

html-agility-pack xpath

我正在嘗試使用XPath 1.0(或可能與Regex一起)選擇元素(a),這些元素遵循特定元素(b)的兄弟,但僅在另一個b元素之前。

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

我試圖使樣本盡可能接近現實世界。所以在這種情況下,當我在元素

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

我需要選擇

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

當我在

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

我需要選擇

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

知道怎麼做到這一點?謝謝!

一般承認的答案

動態創建此XPath:

following-sibling::a[preceding-sibling::b[1][.='xxxx']]

其中'xxxx'被替換為當前<b>的文本。

這假設所有元素實際上都是兄弟姐妹。如果不是,你可以嘗試用上班precedingfollowing坐標軸,或者你寫一個更具體的XPath更好酷似文檔結構。

在XSLT中,您還可以使用:

following-sibling::a[preceding-sibling::b[1][.='xxxx']]

熱門答案

這是一個只有一個XPath表達式的解決方案

使用Kaysian公式來交叉兩個節點集$ns1$ns2

  $ns1[count(. | $ns2) = count($ns2)]

我們簡單地將$ns1替換$ns1跟隨當前<b>節點的<a>兄弟節點的節點集,並且我們將$ns2替換$ns2在下一個<b>節點之前的<a>兄弟節點的節點集。

這是一個使用它的完整轉換

  $ns1[count(. | $ns2) = count($ns2)]

將此轉換應用於以下XML文檔時

  $ns1[count(. | $ns2) = count($ns2)]

產生了正確的結果

  $ns1[count(. | $ns2) = count($ns2)]



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因