Stefan Link: Anzahl meiner Geschwisterknoten

Hallo Experten,

ich habe die letzten Stunden nach der Lösung zu meiner Frage gesucht, aber entweder ich verwende die falschen Suchbegriffe oder ich mache etwas grundsätzlich falsch :/

Folgendes: ich möchte aus einem XML eine sogenannte Treemap bauen und brauche dazu die Anzahl meiner Geschwisterknoten. Also die Zahl der Knoten die auf genau meiner Ebene auch vom gleichen Typ sind. Beispiel:

<a>
  <b>
    <c></c>
    <c></c>
    <c></c>
  </b>
  <b>
    <c></c>
    <c></c>
  </b>
</a>

Ich wende hier ein Template für a an und danach für b und stehe dann auf dem Template für c. Und in C brauche ich die Anzahl der Geschwister also einmal 3 und einmal 2. Ich versuche das bisher so etwa:

<xsl:template-match select="c">
  <div>
    <xsl:attribute name="style">
      <xsl:value-of select="count (/a/b/c) ....">
...

Was aber beides Mal eine 3 ausgibt, weil er ja den ersten Pfad nimmt.

Kann mir hier jemand weiterhelfen? Herzlichen Dank im Voraus!

Grüße,
Stefan

  1. Hallo Stefan,

    <xsl:value-of select="count (/a/b/c) ....">
    ...

    Was aber beides Mal eine 3 ausgibt, weil er ja den ersten Pfad nimmt.

    XPath kann auch "quer" im Baum wandern, schau Dir mal die Dokumentation zu Achsen in XPath an. Um das, was Du willst, zu bewerkstelligen, musst Du die Anzahl an Knoten des Typs VOR dem aktuellen Knoten plus die Anzahl an Knoten des Typs NACH dem aktuellen Knoten addieren:

    <xsl:value-of select="count(preceding-sibling::c) + count(following-sibling::c) + 1" />

    (+1 weil Du offensichtlich den eigenen Knoten mitzählen willst)

    Viele Grüße,
    Christian

  2. Hi,

    <xsl:template-match select="c">

    soll das <xsl:template match="c"> sein?
    template-match kennt weder XSLT 1.0 noch XSLT 2.0

    <div>
        <xsl:attribute name="style">
          <xsl:value-of select="count (/a/b/c) ....">

    Wenn das oben <xsl:template match="c"> wäre:

    count(../c)

    Mit .. gehst Du eine Ebene nach oben (Du befindest Dich in c, eine Ebene weiter oben wäre dann das b, darin zählst Du alle c - also das aktuelle c samt seinen Geschwistern)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.