lu: xPath: Problem beim Filtern mit ancestor-or-self

Hallo alle zusammen,
ich versuche mich gerade in XPath einzuarbeiten, allerdings bin ich auf eins, zwei Probleme gestoßen. Folgende XML-Datei liegt mir vor:

  
<haupt>  
      <zeile>  
        <tag1>  
          <raum>029</raum>  
          <gruppe>CH1</gruppe>  
        </tag1>  
        <tag1>  
          <raum>204</raum>  
          <gruppe>EN1</gruppe>  
        </tag1>  
        <tag1>  
          <raum>139</raum>  
          <gruppe>EN2</gruppe>  
        </tag1>  
        <tag1>  
          <raum>213</raum>  
          <gruppe>GE1</gruppe>  
        </tag1>  
      </zeile>  
      <zeile>  
        <tag1>  
          <raum>029</raum>  
          <gruppe>CH1</gruppe>  
        </tag1>  
        <tag1>  
          <raum>204</raum>  
          <gruppe>EN1</gruppe>  
        </tag1>  
        <tag1>  
          <raum>139</raum>  
          <gruppe>EN2</gruppe>  
        </tag1>  
        <tag1>  
          <raum>213</raum>  
          <gruppe>GE1</gruppe>  
        </tag1>  
        <tag1>  
          <raum>214</raum>  
          <gruppe>GE2</gruppe>  
        </tag1>  
        <tag2>  
          <raum>213</raum>  
          <gruppe>MA2</gruppe>  
        </tag2>  
        <tag2>  
          <raum>029</raum>  
          <gruppe>CH1</gruppe>  
        </tag2>  
      </zeile>  
</haupt>

Mein Ziel ist es diese XML-Datei gezielt nach den gruppen zu filtern, und dann das Array (bspw. für die Gruppe CH1 und EN1) zurückzugeben, sodass am ende nur noch folgendes dasteht (natürlich dann nicht in Form einer XML, sondern in einem Array):

<haupt>  
      <zeile>  
        <tag1>  
          <raum>029</raum>  
          <gruppe>CH1</gruppe>  
        </tag1>  
        <tag1>  
          <raum>204</raum>  
          <gruppe>EN1</gruppe>  
        </tag1>  
      </zeile>  
      <zeile>  
        <tag1>  
          <raum>029</raum>  
          <gruppe>CH1</gruppe>  
        </tag1>  
        <tag1>  
          <raum>204</raum>  
          <gruppe>EN1</gruppe>  
        </tag1>  
        <tag2>  
          <raum>029</raum>  
          <gruppe>CH1</gruppe>  
        </tag2>  
      </zeile>  
</haupt>

dazu hatte ich versucht folgende xpath-Anweisung zu verwenden:

$gefiltert = $xml->xpath("/haupt/zeile/tag1[gruppe='CH1']");

so bekomme ich zunächst nur folgendes Array zurückgeliefert:

	[0] => SimpleXMLElement Object  
		(  
			[raum] => 029  
			[gruppe] => CH1  
		)  
  
	[1] => SimpleXMLElement Object  
		(  
			[raum] => 204  
			[gruppe] => EN1  
		)  
  
	[2] => SimpleXMLElement Object  
		(  
			[raum] => 029  
			[gruppe] => CH1  
		)  
  
	[3] => SimpleXMLElement Object  
		(  
			[raum] => 204  
			[gruppe] => EN1  
		)

soweit sogut, allerdings habe ich ja jetzt nicht mehr den bezug zum tag und der Zeile... eigentlich hatte ich da die [B]ancestor-or-self[/B] Funktion gedacht, allerdings erscheinen dann komischerweise wieder alle Einiträge der XML... woran könnte das liegen? Wo ist mein Fehler? und dritte und letzte Frage: kann ich diese Abfrage noch weiter vereinfachen?

Ich freue mich schon auf eure Antworten. :)

Viele Grüße
lu

  1. Mit XPath navigierst du ueber die XML Knoten. Wenn du die XPath Anweisung ancestor-or-self::* ohne weitere Beschraenkung angibst adressierst du folglich den aktuellen Knoten und alle darueberliegenden knoten. Den aktuellen Knoten kannst du mit current() adressieren. Allerdings wird mir nicht ersichtlich, was du erreichen moechtest.

    Gruss, Holge r

    1. Eigentlich möchte ich nur die Gruppen-Knoten mit bspw. dem Inhalt "CH1" und "EN1" auslesen, allerdings dann mit dem kompletten Pfad bis zur Wurzel.

      Ich habe mittlerweile schon eine Vereinfachung der vorigen Abfrage gefunden:
      //*[gruppe='CH1']|//*[gruppe='EN1']

      so bekomme ich ja nur die Knoten, ohne die Elternknoten. Ich hatte vermutet, dass ich mit ancestor-or-self::* genau dieses Ziel erreiche - wie kann ich denn ancestor-or-self beschränken? wo muss ich mit current() adressieren? Wahrscheinlich statt dem "*" nach ancestor-or-self, oder?

      1. an sich möchte ich eigentlich nur eine absolute Adressierung zur Wurzel haben - nicht mehr und nicht weniger...

        Viele Grüße
        Flo

    2. Hallo!

      Allerdings wird mir nicht ersichtlich, was du erreichen moechtest.

      Mein Ziel ist es eigentlich mit Hilfe von xpath per PHP bestimmte Inhalte aus der XML herauszufiltern, um sie dann in Form eines arrays an ein template weitergeben zu können - dazu benötige ich aber eben nicht nur die ebene in der Raum und Gruppe liegen sondern eben auch alle umittelbaren Eltern (also in einem speziellen Fall tag1 und zeile) Wie kann ich das mit einer xpath-Abfrage erreichen? Ich hatte nach dem was ich über xpath gelesen hatte die achse ancestor-or-self als hilfreich angesehen.. doch irgendwie funktioniert das nicht so - es werden durch das anhängen von ancestor-or-self ALLE knoten zurückgegeben und nicht nur die Eltern wie eigentlich gedacht...

      Ich hoffe ihr könnt meine wirren Verwirrungen verstehen ;-)

      Grüße
      lu