2015-08-28 10 views
6

Wie kann ich in XPath 1.0 alle Nachfolgerknoten C des aktuellen (Kontext-) Knotens A auswählen, die nicht in einem dazwischen liegenden Knoten vom Typ B enthalten sind? B. alle <a> Links im aktuellen Element finden, die nicht in einem <p> enthalten sind. Aber wenn das aktuelle Element sich selbst in einem <p> befindet, ist das irrelevant.Wählen Sie Abkömmlingselemente aus, die nicht in einem anderen Elementtyp enthalten sind

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

Die ... im Beispiel mehrere Tiefen des dazwischen liegenden Knoten sein könnte.

Ich schreibe XSLT 1.0, also sind die zusätzlichen Funktionen generate-id(), current() und so verfügbar.

+0

So etwas wie '/ p/div/a'? Und das ist ein Duplikat von http://stackoverflow.com/questions/15818191/xpath-select-one-type-of-nodes-only-in-direct-child-nodes – fukanchik

+1

@fukanchik nein, ich bin schon in der ' div "(aktueller Kontextknoten) und ich muss alle" a "auswählen, die nicht innerhalb eines" p "liegen, möglicherweise mit mehreren mittleren Knoten dazwischen, zum Beispiel mehrere Ebenen von" div "dazwischen. – Tobia

Antwort

5

Dies ist eine mögliche XPath:

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

Dieser XPath prüft, ob aktuelle Nachkomme a Element nicht über Vorfahren p die Vorfahren aktuellen Kontextknoten ist. Mit anderen Worten, es wird geprüft, ob das a-Element keinen Vorgänger zwischen dem a und dem aktuellen Kontextknoten hat.

+1

Das macht Sinn, aber ist das '' 'das Richtige dort? Brauche ich nicht etwas wie '.// a [nicht (Vorfahr :: p/Vorfahre :: * [generiere-id (.) = Generiere-id (aktuelle())])]'? – Tobia

+0

@Tobia Sorry, ich bin mir nicht sicher, ob der Ausdruck den Wert des Elements vergleicht oder die Elemente durch Referenz vergleicht (was ich hoffe) – har07

+2

Ich glaube nicht, dass es richtig ist, denn "wenn beide Objekte sein sollen verglichen werden Knoten-Sets, dann ist der Vergleich genau dann wahr, wenn es einen Knoten in dem ersten Knoten-Satz und einen Knoten in dem zweiten Knoten-Satz gibt, so dass das Ergebnis des Vergleichs an den ** String-Werten durchgeführt wird ** der zwei Knoten ist wahr. " [Quelle] (http://www.w3.org/TR/xpath/#booleans) – Tobia

Verwandte Themen