2015-06-11 117 views
1

我想選擇在PHP中使用XPath的表單最接近的標題元素(h1,h2,h3,h4,h5或h6) 。XPath:獲取最接近的標題元素(h1,h2,h3等)

<h2>Foo</h2> 
<h3>Bar</h3> 
<form> 
    <input /> 
</form> 

上面的例子應該返回h3(Bar),因爲它最接近表單。

<h4>Kee</h4> 
<form> 
    <input /> 
</form> 

這個例子另一方面應該返回h4(Kee),因爲它是最接近的。

此查詢(來自https://stackoverflow.com/a/2216795/4391251)只適用於h2標籤。我可以修改它爲h1,h3,h4,h5等,但我想要一個全面的查詢。

$headings = $xpath->query('((//form)[2]/ancestor::*/h2[.!=""])[last()]'); 

基本上,我想是這樣的

$headings = $xpath->query('((//form)['.$i.']/ancestor::*/[h2 or h3][.!=""])[last()]'); 

除了不返回任何結果,也不認爲(基於https://stackoverflow.com/a/7995095/4391251

$headings = $xpath->query('((//form)['.$i.']/ancestor::*/[self::h2 or self::h3][.!=""])[last()]'); 

什麼查詢會給想要的結果?

回答

1

你可以嘗試這樣的事情:

$xpath->query('//form['.$i.']/preceding-sibling::*[self::h2 or self::h3][1]') 

基本上,XPath的獲得form[i]<h2>類型或<h3>(或任何的第一前置兄弟,只列出所有其他元素如需要在XPath謂詞)。

+1

優秀的前!我結束了這樣的使用: $ headings = $ xpath-> query('((// form)['。$ i。']/preceding-sibling :: * [self :: h2 or self :: h3 ])[1]'); –

+0

你可以發佈重現問題的示例HTML嗎? – har07

+0

* AFAICS *,在這個答案中解釋過,xpath應該只返回* form的第一個*前面的兄弟,它不可能返回多個元素。 – har07

1

就拿拳頭H型

//form/preceding::*[starts-with(name(),'h')][1] 
+0

這一個遺憾的是還返回了頭元素(因爲它也以h開頭) –

+0

@Theo如果頭和表之間沒有h元素:) – splash58

-1
/html/body/*[starts-with(name(),'h')] 
相關問題