2013-11-01 67 views
0

基本上我試圖實現的是用一個頁面中相應的data-src-nodes的內容替換一堆img-nodes的src-attributes的內容,以下一個。xpath-> query的遞歸上下文節點

<html> 
    <body> 
     <div id="a"> 
     <img src="" data-src="myValue" /> 
     <img src="" data-src="myValue2" /> 
     </div> 
     <img src="" data-src="myValue" /> 
    </body> 
</html> 

我想通過找到一個共同的基節點(在此情況下在div img的節點ID爲一個)來做到這一點,基於該節點

  • 包含該值的節點上覆制和#
  • 節點檢索值

腳本

<?PHP 
$html = '<html><body><div id="a"><img src="" data-src="myValue"/><img src="" data-src="myValue2"/></div><img src="" data-src="myValue"/></body></html>'; 
$doc = new DOMDocument(); 
@$doc->loadHTML($html); 

$basenode = false; 
$xpath = new DOMXPath($doc); 
$entries = $xpath->query('(//div[@id="a"])'); 

if ($entries->length > 0) $basenode = $entries->item(0); 
if ($basenode) { 
    $img = $xpath->query('//img', $basenode); 
    foreach ($img as $curImg) { 
     $from = $xpath->query('//@data-src', $curImg); 
     $to = $xpath->query('//@src', $curImg); 
     $to->item(0)->value = $from->item(0)->value; 
    } 
    echo $doc->saveXML(); 
} 
?> 

預計輸出

<html> 
    <body> 
     <div id="a"> 
     <img src="myValue" data-src="myValue" /> 
     <img src="myValue2" data-src="myValue2" /> 
     </div> 
     <img src="" data-src="myValue" /> 
    </body> 
</html> 

實際輸出

<html> 
    <body> 
     <div id="a"> 
     <img src="myValue" data-src="myValue" /> 
     <img src="" data-src="myValue2" /> 
     </div> 
     <img src="" data-src="myValue" /> 
    </body> 
</html> 

所以,行

$from = $xpath->query('//@data-src', $curImg); 

似乎真正基礎的根節點,而不是IMG-節點上搜索之前選擇。我該如何解決這個問題? (我知道一個可能的解決方法是省略顯式選擇img-nodes,並執行類似於='// div [@ id =「a」]/img/@ data-src'和= '// div [@ id =「a」]/img/@ src'但我有點擔心,我可能最終會在不同節點的屬性之間複製值)

回答

0

/開頭指定一個絕對位置路徑(即從文檔根目錄)。相反,你想使用一個相對(相對於上下文節點)。

例如; .//@data-srcdescendant::img/@data-src等等。

+0

你說得對。完全忘了那個: - /。 – devrandom