2013-03-04 3 views
0

J'écris un XPath et moi avons écrit le XPath qui correspond à certains noeuds dans l'arborescence du documentXPath - Inverser la sélection

Mais je voudrais correspondre à tous les autres éléments à la place, donc je voudrais inverser la sélection dans le cadre du document entier

Alors disons que nous avons la XPath suivante

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

et le document

<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> 

donc les nœuds en majuscules sont appariés, mais ce que je veux réaliser, c'est marquer tous les nœuds minuscules.

Merci pour votre aide

+1

Le DIV n'est pas apparié, BTW. – choroba

Répondre

6

Votre expression XPath originale

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

matchs tous les nœuds d'éléments qui sont des descendants de la <div id="menu"> (mais pas l'élément div lui-même). Selon exactement ce que vous entendez par « inverse », vous pouvez essayer quelque chose comme

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

qui correspond à tous les nœuds d'éléments qui ne sont pas un ancêtre avec id="menu", qui comprendrait le div avec id="menu" mais pas ses enfants ou petits-enfants . Si vous voulez exclure l'div ainsi, utiliser ancestor-or-self:: au lieu de ancestor::


Si vous avez XPath 2.0 alors une réponse plus générale à votre question initiale est de regarder l'opérateur except - XPath 2.0, vous pouvez dire X except Y pour sélectionner tous les noeuds qui correspondent à l'expression X mais pas aussi par Y

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

Il y a aussi union (nœuds correspondant est versé par X ou Y) et intersect (tous deux X et Y).

+0

Ou passez à 'ancestor-or-self' si vous voulez exclure le DIV. – choroba

+0

@choroba nous avons tous deux eu la même idée en même temps :-) –

+0

Nous l'avons fait. J'étais sur le point de poster la même soltuion que toi :) – choroba