2012-02-27 51 views
1

我使用xpath表達式來確定我的DOM樹中的某個div類(感謝VolkerK!)。查找DomNode/Xpath子元素的索引位置

foreach($xpath->query('//div[@class="posts" and div[@class="foo"]]') as $node) 
    $html['content'] = $node->textContent; 
    //$html['node-position'] = $node->position(); // (global) index position of the child 'foo' 
} 

最後,我需要知道哪些(全局)索引位置我的孩子「富」了,因爲我想以後用jQuery來替代它:eq()或者第n個孩子()。

有沒有辦法做到這一點?

我正在跟進另一個關於選擇正確元素的問題(XPath/Domdocument check for child by class name)。

謝謝!

UPDATE:

我發現,使用:

$html['node-position'] = $node->getNodePath() 

居然給我的路徑和XPath語法元素號(/ HTML /體/ DIV [3] )的父節點,但它怎麼能爲孩子div'foo'?

+0

您確定您需要孩子嗎?或者將一個類添加到元素就足夠了?然後你可以做一些像例如'$('。replaceThis')。each(function(e){...});' – VolkerK 2012-02-27 21:39:07

回答

4

中的XPath的方式找到一個給定的元素的「位置」 x(其中位置被定義爲是指元素x的索引在XML文檔中的所有x元件)的序列(在文檔順序)在

count(preceding::x) + count(ancestor-or-self::x) 

當此XPath表達式使用元素x作爲當前節點(初始上下文節點)進行求值時,會生成如此定義的「位置」。

XSLT - 基於驗證

讓我們有這個XML文檔:

<t> 
    <d/> 
    <emp/> 
    <d> 
     <emp/> 
     <emp/> 
     <emp/> 
    </d> 
    <d/> 
</t> 

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="v3rdEmp" select="/*/d/emp[2]"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "count($v3rdEmp/preceding::emp) 
    + 
    count($v3rdEmp/ancestor-or-self::emp) "/> 
</xsl:template> 
</xsl:stylesheet> 

評估使用第三emp元以上XPath表達式在文件中作爲初始上下文n頌。表達式中的x現在被我們想要的元素名稱替換 - emp。然後輸出表達式評估的結果 - 我們看到這是想要的,正確的結果:

3 
+0

很感謝!實際上找到了一個解決方案,製作所有元素的數組,然後比較路徑,但我會檢查。 +1並被接受。 – Mike 2012-02-28 11:39:12

+0

@Mike:當XPath以簡單的表達式向我們提供這些內容時,爲什麼會浪費所有元素的內存(兩次),並編寫不可移植的代碼? – 2012-02-28 14:20:38

0

的foreach supports語法$traversable as $key => $item,所以當你使用:

foreach($xpath->query('//div[@class="posts" and div[@class="foo"]]') as $key => $node) 
    $html['content'] = $node->textContent; 
    $html['node-position'] = $key; 
} 
+0

Hi Vyktor,謝謝!但問題是我有多個'富'元素,其中一些不在'帖子'內,所以我真的很想有一個domnode的解決方案...對不起,我沒有指出。 – Mike 2012-02-27 15:00:32