提问人:Mattias Sander 提问时间:7/19/2021 更新时间:7/19/2021 访问量:84
希望使用 XPath 来确保 XHTML 元素具有具有特定名称的父元素
Want to use XPath to ensure that an XHTML element has a parent a with specific name
问:
XPath的
我有一个XHTML文档,我想在其中使用XPath来确保任何属性设置为的元素都作为父元素。class
block
p
我使用的 XPath 语句不会捕获下面 XHTML 中的违规元素,除非我将元素名称更改为 例如 ,或更改 XPath 语句,替换为 例如.不知何故,存在与父元素具有相同元素名称的同级元素 () 这一事实阻止了它的工作。<p>Lorem ipsum dolor</p>
<b>Lorem ipsum dolor</b>
[not(p)]
[not(u)]
p
关于我应该做什么的任何想法?
(我一直在使用 http://xpather.com/ 来验证我的 XPath)。
XPath的
.//*[contains(concat(" ",normalize-space(@class)," ")," block ")]/parent::*[not(p)]
XHTML的
<?xml version="1.0" encoding="utf-8"?>
<html>
<head>
<style>
</style>
<script>
</script>
<meta name="description"/>
</head>
<body>
<h1>Title</h1>
<div>
<kbd class="block"></kbd>
<p>Lorem ipsum dolor</p>
</div>
</body>
</html>
答:
2赞
zx485
7/19/2021
#1
试试这个 XPath-1.0 表达式:
//*[normalize-space(@class) = "block" and not(parent::p)]
评论
0赞
Mattias Sander
7/19/2021
这就像一个魅力。谢谢!知道为什么不起作用吗?.//*[contains(concat(" ",normalize-space(@class)," ")," block ")]/parent::*[not(p)]
0赞
zx485
7/20/2021
首先,从当前节点开始。因此,与它相比,它不会选择所有可能的节点。其次,测试是不必要的复杂。首先,无需添加空格来检查前导空格和尾随空格。第三,即使前面的检查都成功了,您也尝试选择父节点(而不是包含“block”属性值的节点),该节点也应该满足谓词。要实现此目的,您必须改用它来检查上下文节点本身是否是一个元素。.//
//
block
not(p)
not(self::p)
<p>
0赞
Prophet
7/20/2021
@MattiasSander,如果这解决了你的问题,你为什么不接受答案?
评论