2013-03-04 3 views
0

Я пишу и я XPath написал XPath, который соответствует некоторым узлам в дереве документаXPath - инвертировать выбор

Но я хотел бы соответствовать всем остальным элементам вместо этого, так что я хотел бы, чтобы инвертировать выбор в контексте всего документа

Итак, давайте говорить, что мы имеем следующую

XPath
//*[@id='menu']//* 

и документ

<body> 
<div> 
    <h1>title</h1> 
</div> 
<div> 
<div id="menu"> 
    <UL> 
    <LI>home</LI> 
    <LI>about</LI> 
    </UL> 
</div> 
<div id="sidebar"> 
    <ul> 
    <li>one</li> 
    <li>two</li> 
    </ul> 
</div> 
<div> 
</body> 

, так что узлы с верхним регистром совпадают, но то, что я хочу достичь, это отметить все узлы нижнего регистра.

Спасибо за вашу помощь

+1

DIV не соответствует, BTW. – choroba

ответ

6

Ваше оригинальное выражение XPath

//*[@id='menu']//* 

спичек все узлы элементов, которые являются потомками <div id="menu"> (но не в div самого элемента). В зависимости от того, что вы подразумеваете под «обратным» вы можете попробовать что-то вроде

//*[not(ancestor::*[@id='menu'])] 

, который соответствует всем узлам элементов, которые не имеют предка с id="menu", который будет включать в себя div с id="menu", но не его дети или внуки , Если вы хотите исключить div, а также, использовать ancestor-or-self:: вместо ancestor::


Если у вас есть XPath 2.0, то более общий ответ на ваш первоначальный вопрос, чтобы смотреть на оператора except - в XPath 2.0 вы можете сказать X except Y, чтобы выбрать все узлы подбираются выражениями X, но не также Y

//* except //*[@id='menu']//* 

Есть также union (узлы совпадающих либо X или Y) и intersect (оба X и Y) операторы.

+0

Или измените на 'ancestor-or-self', если вы хотите исключить DIV. – choroba

+0

@choroba у нас обоих были одинаковые мысли в то же время :-) –

+0

Мы сделали. Я собирался опубликовать тот же голос, что и вы. :) – choroba

Смежные вопросы