希望使用 XPath 来确保 XHTML 元素具有具有特定名称的父元素

Want to use XPath to ensure that an XHTML element has a parent a with specific name

提问人:Mattias Sander 提问时间:7/19/2021 更新时间:7/19/2021 访问量:84

问:

XPath的

我有一个XHTML文档,我想在其中使用XPath来确保任何属性设置为的元素都作为父元素。classblockp

我使用的 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>
C# XPath XHTML

评论

1赞 Fildor 7/19/2021
您是否考虑过改用验证工具?
0赞 Fildor 7/19/2021
这回答了你的问题吗?如何根据指定的DTD验证xhtml文件?
0赞 Mattias Sander 7/19/2021
嘿@Fildor!感谢您的快速帮助!不幸的是,这对我没有帮助。我需要使用 XPath。

答:

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”属性值的节点),该节点也应该满足谓词。要实现此目的,您必须改用它来检查上下文节点本身是否是一个元素。.////blocknot(p)not(self::p)<p>
0赞 Prophet 7/20/2021
@MattiasSander,如果这解决了你的问题,你为什么不接受答案?