2011-12-02 92 views
0

接聽question,我注意到下面的表達式奇怪的libxml行爲:什麼XPath表達式 '//祖先:: * [@ ID] [1]' 實際上意味着

//ancestor::*[@id][1] 

給定上下文節點。我試圖理解這個表達的實際含義。

以下是在PHP片段和它的調用的結果:

$html = <<<HTML 
<div id="div1"> 
    <div id="div2"> 
     <p id="p1">Content</p> 
    </div> 
    <div id="div3"> 
     <p id="p2">Content</p> 
    </div> 
</div> 
HTML; 

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXpath($doc); 

$contextNode = $doc->getElementById('p1'); 
$list = $xpath->query('//ancestor::*[@id][1]', $contextNode); 

printf("NodeList length: %d\n", $list -> length); 
foreach ($list as $node) { 
    printf ("item/@id -> %s\n", $node -> getAttribute('id')); 
} 

結果:

NodeList length: 5 
item/@id -> div1 
item/@id -> div2 
item/@id -> p1 
item/@id -> div3 
item/@id -> p2 

回答

4

//ancestor::*[@id][1]/descendant-or-self::node()/ancestor::*[@id][1]短形式,從而上下文節點是唯一的相關用於確定它的根或文檔節點/,則在第一步descendand-or-self::node()中,節點集由文檔節點及其所有後代節點(元素節點,文本節點,註釋節點,處理inst然後每個節點的下一步確定ancestor::*[@id][1],即所有祖先元素都具有id屬性的第一個屬性。

+0

是的,你說得對,我已經意識到了自己。但是謝謝你! – newtover

相關問題