2011-01-07 5 views
2

Ich versuche, eine XPath-Abfragezeichenfolge herauszufinden, um die folgende Operation auszuführen.Relative XPath-Abfragen, die nach "Ebene" durchlaufen

ein XML-Dokument wie folgt gegeben:

<root> 
    <data>foo1</data> 
    <irrelevant-node> 
     <data>foo1</data> 
    </irrelevant-node> 
    <irrelevant-node /> 
    <data>foo2</data> 
    <irrelevant-node /> 
    <region> 
     <data>bar1</data> 
     <data>bar2</data> 
     <irrelevant-node /> 
     <region> 
      <data>hello1</data> 
      <irrelevant-node /> 
      <data>hello2</data> 
      <region> 
       <irrelevant-node /> 
       <data>world1</data> 
      </region> 
     </region> 
     <irrelevant-node /> 
     <data>bar3</data> 
     <irrelevant-node> 
      <data>foo1</data> 
     </irrelevant-node> 
     <irrelevant-node /> 
    </region> 
    <irrelevant-node /> 
</root> 

Ich möchte innerhalb eines <region> nicht enthalten sind alle der <data> Knoten greifen.

Dann möchte ich alle obersten <region> Knoten greifen und den vorherigen Prozess auf ihnen wiederholen, relativ arbeiten.

Im Wesentlichen werde ich eine Reihe von Prozessen (PHP) auf den <data> Knoten basierend auf ihren Inhalten durchführen und sie dann ersetzen. Die Knoten <region> fungieren jedoch als eine Art Bereichsbegrenzer, und wenn ich alle <data> Knoten in einem bestimmten Bereich bearbeitet habe, bewege ich mich auf Regionsebene nach unten. <data> Knoten können in anderen irrelevanten Knoten verschachtelt sein.

Nicht sicher, ob XPath das beste Werkzeug dafür ist, und ich habe viel Mühe, dies zu beheben. Wie bereits erwähnt, verwende ich die PHP-Implementierung der DOM-Klassen.

+0

die/root/region/irrelevant-node/data sollte in der zweiten Iteration auch mit "bar ..." "data" ausgewählt werden? –

+0

** @ Alejandro **: Das ist richtig. Die erste Iteration sollte alle "foo" -Daten erfassen. Die zweite, "Bar". Dritte hallo, und so weiter. – Dan

+0

Gute Frage, +1. Siehe meine Antwort für Erklärung und Lösung. :) –

Antwort

3

Im Wesentlichen werde ich Durchführung einer Reihe von Prozessen (PHP) auf den Knoten auf ihre Inhalte basierend sein, sie dann zu ersetzen. Knoten fungieren jedoch als eine Art von Geltungsbereich Delimiter, und wenn ich fertig Verarbeitung aller <data> Knoten in einem gegebenen Bereich, gehe ich eine Region-Ebene. <data> Knoten können innerhalb andere irrelevante Knoten geschachtelt werden.

Verwenden:

//data[count(ancestor::region) = $n] 

wo $n 0, 1, ..., Max-Tiefe.

Für jeden Wert von $ n wählt der Ausdruck alle data Elemente auf "Ebene $ n" aus.

Sie können die "max-depth" als das Maximum des count(ancestor::region)+1 für jeden der Knoten, die durch ausgewählte finden:

//region[not(descendant::region)] 

Dieses maximale in einem einzigen XPath 2.0-Ausdruck angegeben werden, aber nicht mit einem einzelnen XPath 1.0-Ausdruck.

+0

Danke ** Dimitre Novatchev **; Ich werde es versuchen :) – Dan

+0

Hmm, es scheint nicht zu funktionieren; gibt an, dass es sich um einen ungültigen Ausdruck handelt. Ich testete '// zuq: data [count (ancestor :: zuq: region = 0)]' (ich habe nicht erwähnt, dass die Zielknoten im 'zuq'-Namespace sind) und es ist fehlerhaft. – Dan

+0

Sorry, vergiss es, es war eine Sammlung von deinen und meinen Tippfehlern :) Hervorragend! Nochmals vielen Dank ** Dimitre **! – Dan

Verwandte Themen