首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xpath表达式'//ancestor::*[@id][1]‘到底是什么意思

xpath表达式'//ancestor::*[@id][1]‘到底是什么意思
EN

Stack Overflow用户
提问于 2011-12-02 21:46:07
回答 1查看 726关注 0票数 0

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

代码语言:javascript
复制
//ancestor::*[@id][1]

对于给定的上下文节点。我正在试着理解这个表达的实际含义。

以下是PHP中的一个片段及其调用结果:

代码语言:javascript
复制
$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'));
}

结果:

代码语言:javascript
复制
NodeList length: 5
item/@id -> div1
item/@id -> div2
item/@id -> p1
item/@id -> div3
item/@id -> p2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-02 22:02:19

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8357276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档