假设我有这样的HTML:
<div id="wrap">
<div id="content">
<span>some content</span>
<div id="s1">
<p> some text </p>
</div>
<h2 id="sec1">
<span> some text </span>
<p> some text </p>
</h2>
<h2 id="sec1">
<span> some text </span>
<div> some more text </div>
<p> some text </p>
</h2>
<h2 id="sec2">
<span> do not select me some text </span>
<div> do not select me some more text </div>
<p> do not select me some text </p>
</h2>
<h2 id="sec3">
<span> do not select me some text </span>
<div> do not select me some more text </div>
<p> do not select me some text </p>
</h2>
</div>
</div>
选择除h2 id = sec2和h2 id = sec3之外的所有文本节点的XPath表达式是什么?
答案 0 :(得分:2)
从字面上看,“除了那些在h2 id = sec2和h2 id = sec3之外的文本节点”:
//text()[not(ancestor::h2[@id='sec2' or @id='sec3'])]
但是我怀疑你并不是真的想要那样,因为你会失去<span>
和<p>
结构。推断您要选择内容<div>
的所有子元素是否正确,除了id为sec2和sec3的<h2>
之外?如果是的话,
/div/div[@id = 'content']/*[not(self::h2 and (@id = 'sec2' or @id = 'sec3'))]
但是您还应该知道<h2>
元素的文本内容仅仅是某个部分的标题,而不是该部分的全文。因此看起来像将div和p放在h2中,你没有按照设计的方式使用它。
答案 1 :(得分:1)
<h2>
下的所有元素(除了......):
//h2[not(@id = 'sec2' or @id = 'sec3')]/*
所有<span>
,<div>
或<p>
元素任何地方(除了......):
//*[self::span or self::div or self::p][not(parent::h2/@id = 'sec2' or parent::h2/@id = 'sec3')]
备选表示法(注意parens和稍微改变的谓词):
(//span|//div|//p)[not(parent::h2[@id = 'sec2' or @id = 'sec3'])]