xpath - XPath 在特定标签的任意嵌套链中选择节点
问题描述
在这样的示例中:
<body>
<p id="0"/>
<div>
<p id="1"/>
</div>
<div>
<div>
<div>
<p id="2"/>
</div>
</div>
</div>
<blockquote>
<p id="3"/>
</blockquote>
<div>
<blockquote>
<div>
<p id="4"/>
</div>
</blockquote>
</div>
</body>
我想选择所有<p>
元素的直接子元素<body>
或仅包含在元素链中,仅此<div>
而已。也就是说,我想选择 ids 0、1 和 2,而不是 3 或 4。在正则表达式中,这类似于<body>(<div>)*<p>
. 但是这可以用 XPath 完成吗?的一些简写body/p | body/div/p | body/div/div/p | body/div/div/div/p | ...
?
ETA:请注意,id
为方便起见,此示例中仅存在属性,在我的实际应用程序中没有id
s。
此外,最终我在一个可以使用任意节点作为参考(而不仅仅是<body>
)的表达式之后,即如何选择作为参考节点的后代的节点,但它们之间的任何中间级别在哪里,仅此<div>
而已. 另一种说法是,我想要其祖先都是<div>
特定参考节点(不仅仅是标签名称,而是特定节点)的全部或祖先或自我的节点。
当我说“参考节点”时,我的意思是要使用的东西,例如 Pythonlxml
包:
reference_node.xpath( problem_expression )
解决方案
我想到的是:
//p[count(ancestor::div)=count(ancestor::*[ancestor::body])]
输出:id=0,id=1,id=2
推荐阅读
- java - 从文件中读取类的对象数组
- python - Python——获取排序列表中元素索引的有效方法,使用多个属性排序
- c - 在内核模块上获得正常运行时间?
- python - python中的圆括号或大括号中不存在逗号上的拆分字符串
- webassembly - 分布式普适计算中的 WebAssembly
- angular - ngSwitch 在评估为 true 时不显示项目
- r - R, rowMeans by Column in data.frame
- c# - Unity C# 对话显示,每个字母在下一个字母部署之前部署两次
- java - Java 中的 wait() 和 notify() 是如何工作的?
- sybase - 编写完整的 Sybase 数据库脚本