Ralf: XPath-Beispiel für descendant-or-self und descendant

Hallo,

Ich beschäftige mich gerade mit Xpath und mir ist der Unterschied zwischen den Achsenausdrücken :

descendant-or-self

und descendant

nicht ganz klar.

Könnte mir jemand an einem konkreten, kurzen Beispiel erklären, worin sich die Achsenausdrücke

//x

/descendant::x

unterscheiden ?

Bei meinen bisherigen Tests führen beide Ausdrücke zum selben Ergebnis.

Vielen Dank im Voraus !

Ralf T.

  1. Hallo,

    Ich beschäftige mich gerade mit Xpath und mir ist der Unterschied zwischen den Achsenausdrücken :
    descendant-or-self und descendant nicht ganz klar.
    Könnte mir jemand an einem konkreten, kurzen Beispiel erklären, worin sich die Achsenausdrücke

    //x
    /descendant::x
    unterscheiden ?
    Bei meinen bisherigen Tests führen beide Ausdrücke zum selben Ergebnis.

    In dienem Test gibt es auch keinen Unterschied, weil du vom Wurzelknoten ausgehst.
    Der Unterschied wäre: descendant selektiert die Kinder des Ausgangknotens und deren Kinder und deren Kinder usw. descendant-or-self macht das selbe mit dem Unterscied, dass es als ersten den Ausgangknoten selbst nimmt.

    Man könnte auch so eine Selektion haben:

    a/b/c/descendant::c  = würde nur die Kindelemente "c" usw. unter a/b/c finden   a/b/c/descendant-or-self::c würde a/b/c selbst und die Kinder usw. treffen.

    Aie Abkürzung // entsprich technisch descendant-or-self, also könnte man statt a/b/c/descendant-or-self::c einfach a/b/c//c schreiben.

    Vielleicht mit Bildern:

    http://de.selfhtml.org/xml/darstellung/anzeige/descendant.htm

    http://de.selfhtml.org/xml/darstellung/anzeige/descendant_or_self.htm

    Grüße
    Thomas

    1. In dienem Test gibt es auch keinen Unterschied, weil du vom Wurzelknoten ausgehst.
      Der Unterschied wäre: descendant selektiert die Kinder des Ausgangknotens und deren Kinder und deren Kinder usw. descendant-or-self macht das selbe mit dem Unterscied, dass es als ersten den Ausgangknoten selbst nimmt.

      Man könnte auch so eine Selektion haben:

      a/b/c/descendant::c  = würde nur die Kindelemente "c" usw. unter a/b/c finden   a/b/c/descendant-or-self::c würde a/b/c selbst und die Kinder usw. treffen.

      Aie Abkürzung // entsprich technisch descendant-or-self, also könnte man statt a/b/c/descendant-or-self::c einfach a/b/c//c schreiben.

      Vielleicht mit Bildern:

      http://de.selfhtml.org/xml/darstellung/anzeige/descendant.htm

      http://de.selfhtml.org/xml/darstellung/anzeige/descendant_or_self.htm

      Grüße
      Thomas

      Hallo Thomas,

      Vielen Dank für dein Beispiel und den Link.

      Es hat mir sehr geholfen !

      Es geht also um den Kontextknoten :

      Wenn der Kontextknoten den gleichen Namen hat wie die Nachfolgerknoten ,dann kommen bei diesen beiden Pfadausdrücken unterschiedliche Ergebnisse raus.

      Hat der Kontextknoten eine andere Bezeichnung als seine Nachfolgerknoten, dann sind die Ergebnisse von descendant und descendant-or-self immer gleich.

      Ist das so richtig ?

      Grüße,

      Ralf

      1. Hallo,

        Es geht also um den Kontextknoten :

        Wenn der Kontextknoten den gleichen Namen hat wie die Nachfolgerknoten ,dann kommen bei diesen beiden Pfadausdrücken unterschiedliche Ergebnisse raus.

        Ja. *

        Hat der Kontextknoten eine andere Bezeichnung als seine Nachfolgerknoten, dann sind die Ergebnisse von descendant und descendant-or-self immer gleich.

        Ist das so richtig ?

        Ja. *

        * =  und dann nein ;-)

        Unsere Beispiele waren einfach um das Prinzip zu verstehen. Aber man kann mit XPath-Ausdrücken auch komplexere Test machen. Z.B wenn man auf Identität prüfen will:

        <xsl:variable name="x" select="generate-id(/a/b/c[.='foo'])"/>
        <xsl:template match="*">
        <xsl:if test="descendant-or-self::*[generate-id(.)=$x]">

        Aber im Grunde geht es immer darum welche Knoten bei solchen Test beachtet werden sollen: nur die Nachfahren oder bei Erfüllung einer Bedingung auch der Ausgansknoten selbst.

        Grüße
        Thomas