Какое выражение Xpath включает в себя несколько исключений? - PullRequest
1 голос
/ 06 июня 2011

Предположим, у меня есть 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>

Какое выражение XPath выбирает все текстовые узлы, кроме тех, которые находятся под h2 id = sec2 и h2 id = sec3?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Буквально, «все текстовые узлы, кроме тех, которые находятся под h2 id = sec2 и h2 id = sec3»:

//text()[not(ancestor::h2[@id='sec2' or @id='sec3'])]

Однако я подозреваю, что вы действительно этого не хотите, потому чтопотеря структуры <span> и <p>.Было бы правильно сделать вывод, что вы хотите выбрать все дочерние элементы содержимого <div>, кроме <h2> с идентификаторами sec2 и sec3?Если это так,

/div/div[@id = 'content']/*[not(self::h2 and (@id = 'sec2' or @id = 'sec3'))]

Но вы также должны знать, что текстовое содержимое элемента <h2> является просто заголовком раздела, а невесь текст раздела.Так что, если поместить div и p внутри h2, то вы не используете его так, как оно задумано.

1 голос
/ 06 июня 2011

Все элементы в <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')]

альтернативные обозначения (обратите внимание на парены и слегка измененный предикат):

(//span|//div|//p)[not(parent::h2[@id = 'sec2' or @id = 'sec3'])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...