Paul Brunner: erster Geschwister-Vorgänger des aktuellen Knoten

Guten Morgen,

ein kniffliges xPath-Problem und die Bitte um Literatur-Empfehlungen:

Angenommen im folgenden xml-Auszug bei einer Transformation sei der entry-Knoten mit nr="5" der aktuelle Knoten. Ich möchte den Wert des Attributes nr des Vorgänger-Geschwisters ermitteln, also 4. (entry ist in Wirklichkeit nicht leer sondern enthält weitere Knoten)

xml-Auszug:
*----
<entry nr="1" />
<entry nr="2" />
<entry nr="3" />
<entry nr="4" />
<entry nr="5" />
*----

Folgender xPath-Ausdruck sollte nach meinem Verständniss das gewünschte Ergebnis bringen. Statt dessen liefert er immer 1.
Wo ist mein Denkfehler?

xPath:
*----
preceding-sibling::node()/attribute::nr[last()]
*----

Die zweite Frage: Wer kann ein gutes Buch zum Thema xsl&Co empfehlen, in dem die Feinheiten etwas detailierter beschrieben werden?

Gruß
Paul

  1. Hallo Paule,

    Folgender xPath-Ausdruck sollte nach meinem Verständniss das gewünschte Ergebnis bringen. Statt dessen liefert er immer 1.
    Wo ist mein Denkfehler?

    xPath:
    *----
    preceding-sibling::node()/attribute::nr[last()]
    *----

    Bei den preciding-Achsen wird in umgekehrter Dokumentenordnung gezählt, d.h. du must nicht erst die ganze Achse auswählen und dann das letzte Glied der Knotenmenge wählen, sondern "rückwärts" vom Kontextknoten aus das erste:

    preceding-sibling::node()[1]/@nr

    Zur Illustration ein Beispiel, welches sich an deines anlehnt:

    XML

    <?xml-stylesheet href="test.xsl" type="text/xsl"?>
    <entries>
      <entry nr="1" />
      <entry nr="2" />
      <entry nr="3" />
      <entry nr="4" />
      <entry nr="5" />
    </entries>

    XSL

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="entries">
        <html>
          <head>
            <title>Test preceding-sibling</title>
          </head>
          <body>
            xsl:apply-templates/
          </body>
        </html>
      </xsl:template>

    <xsl:template match="entry">
        <p>
          Nr. des aktuellen entrys:<xsl:value-of select="@nr"/><br/>
          Nr. des vorhergehenden entrys:<xsl:value-of select="preceding-sibling::node()[1]/@nr"/>
        </p>
      </xsl:template>

    </xsl:stylesheet>

    Die zweite Frage: Wer kann ein gutes Buch zum Thema xsl&Co empfehlen, in dem die Feinheiten etwas detailierter beschrieben werden?

    Auf deutsch kann ich dieses (sowohl vom Preis als auch vom Inhalt her) empfehlen:
    http://www.amazon.de/exec/obidos/ASIN/3826672097/qid=1023266486/sr=8-2/ref=sr_aps_prod_2_1/302-7143576-1257668

    Auf englisch und ungeschlagen (und den höheren Preis wirklich Wert):
    http://www.amazon.de/exec/obidos/ASIN/1861005067/qid=1023266580/sr=10-1/ref=sr_sp_bow/302-7143576-1257668

    Ein dickeres Werk auf deutsch (Übersetzung), das ich nicht kenne ist auch:
    http://www.amazon.de/exec/obidos/ASIN/3827262607/qid=1023266580/sr=2-2/ref=sr_2_3_2/302-7143576-1257668

    Tja, und in selfhtml (wie du ja wahrscheinlich weisst), steht auch einiges.

    Gruß
    Franz

    Gruß
    Paul

    1. Hallo Paule,

      Hallo Franzl, :)

      preceding-sibling::node()[1]/@nr

      Sablotron kann wohl nicht richtig zählen, so ist der erste Vorgänger
      mit [2] zu erreichen, [1] ist leer: preceding-sibling::node()[2]/@nr tuts also.

      Danke für die Literatur-Tips

      Gruß
      Paul

      1. hallo,

        preceding-sibling::node()[1]/@nr

        Sablotron kann wohl nicht richtig zählen, so ist der erste Vorgänger
        mit [2] zu erreichen, [1] ist leer: preceding-sibling::node()[2]/@nr tuts also.

        oh, der kann schon richtig rechnen.
        eistens lieg es an einer kleinigkeit, dass die zählung immer in zweier schritten passiert (z.b. ein textknoten dazwischen etc.). aber da ich deinen code nicht kenne, kann ich auch nicht sagen was diese kleinigkeit bei dir sein kann.

        grüße
        thomas