2015-08-28 37 views
6

In XPath 1.0, come posso selezionare tutti i nodi discendenti C del nodo (contesto) corrente A, che non sono contenuti in un nodo intermedio di tipo B?Seleziona elementi discendenti che non sono contenuti in un altro tipo di elemento

Ad esempio, trovare tutti i collegamenti <a> contenuti nell'elemento corrente, che non si trovano all'interno di <p>. Ma se l'elemento corrente si trova all'interno di un <p>, è irrilevante.

<p>     <—— this is irrelevant, because it's outside the current element 
    ... 
    <div>    <—— current element (context node) 
     ... 
     <a></a>  <—— the xpath should select this node 
     ... 
     <p> 
      ... 
      <a></a> <—— but not this, because it's inside a p, which is inside context 
      ... 
     <p> 
     ... 
    </div> 
    ... 
</p> 

Il ... nell'esempio potrebbero essere diverse profondità di nodi intermedi.

Sto scrivendo XSLT 1.0, quindi sono disponibili le funzioni aggiuntive generate-id(), current() e simili.

+0

Qualcosa come '/ p/div/a'? E questo è un duplicato di http://stackoverflow.com/questions/15818191/xpath-select-one-type-of-nodes-only-in-direct-child-nodes – fukanchik

+1

@fukanchik no, sono già nel ' div' (current context node) e ho bisogno di selezionare tutti 'a' che non sono all'interno di un' p', possibilmente con diversi nodi intermedi nel mezzo, per esempio diversi livelli di 'div' in mezzo. – Tobia

risposta

5

Questa è una possibile XPath:

.//a[not(ancestor::p/ancestor::* = current())] 

Questo XPath controlla se discendente corrente a elemento non ha antenato p cui antenato è nodo del contesto corrente. In altre parole, controlla se l'elemento a non ha l'antenato p che interviene tra lo a e il nodo di contesto corrente.

+1

Questo ha senso, ma il '=' sta facendo la cosa giusta lì? Non ho bisogno di qualcosa come '.// a [non (ancestor :: p/ancestor :: * [generate-id (.) = Generate-id (corrente())])]'? – Tobia

+0

@Tobia Scusa, non sono sicuro di me stesso se l'espressione confronta il valore dell'elemento o confronta gli elementi per riferimento (che spero di fare) – har07

+2

Non penso sia giusto, perché "Se entrambi gli oggetti devono essere confrontati sono set di nodi, quindi il confronto sarà vero se e solo se c'è un nodo nel primo set di nodi e un nodo nel secondo set di nodi tale che il risultato dell'esecuzione del confronto sui ** valori-stringa ** dei due nodi è vero. " [fonte] (http://www.w3.org/TR/xpath/#booleans) – Tobia