xpath表达式'// ancestor :: * [@ id] [1]'实际上意味着什么

时间:2011-12-02 13:46:07

标签: xpath

回答question,我注意到以下表达式的奇怪的libxml行为:

//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

1 个答案:

答案 0 :(得分:4)

//ancestor::*[@id][1]/descendant-or-self::node()/ancestor::*[@id][1]的缩写形式,因此上下文节点仅与确定其根节点或文档节点/相关,然后在第一步descendand-or-self::node()节点-set由文档节点及其所有类型的后代节点(元素节点,文本节点,注释节点,处理指令节点)组成,然后每个节点的下一步确定ancestor::*[@id][1],即所有具有id属性的祖先元素是第一个。