什么是涉及多个排除的Xpath表达式?

时间:2011-06-06 15:43:31

标签: xpath

假设我有这样的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表达式是什么?

2 个答案:

答案 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'])]