josef stebegg: xpath und attribute

Hallo!

Bei einem Stammbaum habe ich noch (mindestens) zwei Schoenheitsfehler.

Eine Elementgruppe (xml) sieht etwa so aus:

<paar>
 <mann geb="1614" ges="1665" rg1="1621" rg2="1665" farbe="666" zeile="16">
   <name>Philipp IV </name>
   </mann>
 <ehe hochzeit="1640" hz2="1660" farbe="666" zeile="17">
   <kinder geburt="1645" nr="1" t2="40">Karl (II)</kinder>
   </ehe>
 .............
</paar>

der wesentliche Teil der xsl:

<xsl:for-each select="ehe/kinder">
 ...............
 <xsl:variable name="vater">background:#<xsl:value-of select="../@farbe"/></xsl:variable>
 .......................
 <div style="position:absolute; {$kind}; {$ebene1}; {$vert1}; {$vater}; width:1px; " class="hline1" >
 <xsl:value-of select="ehe/kinder" /></div>
 </xsl:for-each>

Da nun aber die Farbe (hier #666) immer auch schon beim mann-element vorkommt, wollte ich sie mir auch dort holen.
 Nach den diversen Lehrbuechern und tutorials (die aber kein passendes Beispiel haben) kann ich mir nur soetwas  vorstellen :
 <xsl:value-of select="preceding-sibling::mann/@farbe"/>
 ...funktioniert aber nicht.

Eine moegliche Frage warum ich nicht gleich die Attribute in das mann-element gelegt habe erklaert sich daraus daß nicht alle "paar" elemente ein ehe bzw kinder element haben und ich nach der Umwandlung mit insant-saxon jede Menge Blindzeilen haben wuerde.

Die zweite Frage betrifft auch die Farbe.
Es waere schoen wenn ich anstelle von farbe="666" gleich farbe="span-habsburg" schreiben koennte.
Wie kann man das bitte realisieren.

Josef

  1. hallo josef,

    der wesentliche Teil der xsl:

    <xsl:for-each select="ehe/kinder">
    <div><xsl:value-of select="ehe/kinder" /></div>
    </xsl:for-each>

    und das funktioniert für die ausgabe?
    du bist (durch for-each) bereits in ehe/kinder dann gehst du nochmal weiter "hinunter" ehe/kinder
    also jetzt hast du einen pfad der so geht: ehe/kinder/ehe/kinder .

    Da nun aber die Farbe (hier #666) immer auch schon beim mann-element vorkommt, wollte ich sie mir auch dort holen.
    Nach den diversen Lehrbuechern und tutorials (die aber kein passendes Beispiel haben) kann ich mir nur soetwas  vorstellen :
    <xsl:value-of select="preceding-sibling::mann/@farbe"/>
    ...funktioniert aber nicht.

    dazu müsste man deinen xsl sheet sehen.
    sonst könntest du es ähnlich wie schon gemacht: select="../../@farbe"/ machen

    Die zweite Frage betrifft auch die Farbe.
    Es waere schoen wenn ich anstelle von farbe="666" gleich farbe="span-habsburg" schreiben koennte.

    ich wüsste nichts was dich daran hindern sollte. was du in einem atributwert schreibst ist deine sache (bzw. der von der DTD)

    grüße
    thomas

    1. hallo josef,

      der wesentliche Teil der xsl:

      <xsl:for-each select="ehe/kinder">
      <div><xsl:value-of select="ehe/kinder" /></div>
      </xsl:for-each>

      und das funktioniert für die ausgabe?
      du bist (durch for-each) bereits in ehe/kinder dann gehst du nochmal weiter "hinunter" ehe/kinder
      also jetzt hast du einen pfad der so geht: ehe/kinder/ehe/kinder .

      Da nun aber die Farbe (hier #666) immer auch schon beim mann-element vorkommt, wollte ich sie mir auch dort holen.
      Nach den diversen Lehrbuechern und tutorials (die aber kein passendes Beispiel haben) kann ich mir nur soetwas  vorstellen :
      <xsl:value-of select="preceding-sibling::mann/@farbe"/>
      ...funktioniert aber nicht.

      dazu müsste man deinen xsl sheet sehen.
      sonst könntest du es ähnlich wie schon gemacht: select="../../@farbe"/ machen

      Die zweite Frage betrifft auch die Farbe.
      Es waere schoen wenn ich anstelle von farbe="666" gleich farbe="span-habsburg" schreiben koennte.

      ich wüsste nichts was dich daran hindern sollte. was du in einem atributwert schreibst ist deine sache (bzw. der von der DTD)

      grüße
      thomas

      ....................................................

      Hallo Thomas!

      Danke fuer Deine Antwort.

      Ich habe jetzt die drei notwendigen Dateien ins Netz gestellt.
      http://www.innonet.at/~jstebegg/xml/kuk93a.xml (gekuerzt) sowie /kuk93a.xsl und /reg93a.css.

      Die fast fertige (nachbearbeitete) html:
      http://www.innonet.at/~jstebegg/jt2/kuk92.html

      jetzt hast du einen pfad der so geht: ehe/kinder/ehe/kinder

      Solche Fehler habe ich leider oefter. Da es funktioniert faellt es mir auch schwer auf.
      Im speciellen Fall kann ich sogar ausser "." alles moegliche hineinschreiben !?

      Die senkrechte Verbindungslinie von der kleinen Zahl zum Anfang einer darunter liegenden Linie bekomme ich bis jetzt nur wenn ich in der xml das "farbe" attribut in das <ehe> element schreibe und in der xsl
       <xsl:value-of select="../@farbe"/>.

      bei ../../ komme ich doch in das <paar> element und wie ein Versuch bestaetigt hat wuerde ../../@farbe"/ ein attribut auswaehlen das sich im <paar> element befindet.

      Ihr habt in Eurem Buch ein paar schoene Achsenbilder und Knotentestbeispiele (leider nicht im praktischen Einsatz). Wenn
      <xsl:value-of select="preceding-sibling::mann/@farbe"/> nicht stimmt dann habe ich es trotzdem noch nicht verstanden.
      Vielleicht liegt mein Fehler aber auch ganz wo anders.

      ------

      ich wüsste nichts was dich daran hindern sollte. was du in einem atributwert schreibst ist deine sache (bzw. der von der DTD)

      ---wenn man weis wie man dem Browser mitteilt das dann z.B. farbe="spanisch-habsburg" die farbe #666 ist.
       Wenn das nur ueber eine DTD geht die ich mir bis jetzt geschenkt habe, dann muß ich mich doch einmal damit genauer beschaeftigen.

      gruesse
      josef

      1. hallo Josef,

        jetzt hast du einen pfad der so geht: ehe/kinder/ehe/kinder
        Solche Fehler habe ich leider oefter. Da es funktioniert faellt es mir auch schwer auf.

        ne, es funktioniert nicht.

        Im speciellen Fall kann ich sogar ausser "." alles moegliche hineinschreiben !?

        nein, das ist auch dein meistvergekommener fehler, dass du statt "." (den du bist ja durch for-each bereits im gewünschten knoten) weitere pfade definierst.

        bei ../../ komme ich doch in das <paar> element und wie ein Versuch bestaetigt hat wuerde ../../@farbe"/ ein attribut auswaehlen das sich im <paar> element befindet.

        richtig, deshalb muss du wieder einen schritt nach unten gehen:
        <xsl:value-of select="../../mann/@farbe"/>

        Ihr habt in Eurem Buch ein paar schoene Achsenbilder und Knotentestbeispiele (leider nicht im praktischen Einsatz). Wenn
        <xsl:value-of select="preceding-sibling::mann/@farbe"/> nicht stimmt dann habe ich es trotzdem noch nicht verstanden.

        soory, ader wie es den anschein hat, hast du es vielleicht noch nicht ganz verstanden:

        preceding-sibling wählt die vorangegangene elemte (geschwister) des aktuellen elements vom selben elternelement.

        was du hier suchst ist eine kombination vom ancestor:: und preceding-sibling::

        probiere es mal aus:
         <h1><xsl:value-of select="$vater" /><xsl:value-of select="ancestor::*[1]/preceding-sibling::*[1]/@farbe" /> (<xsl:value-of select="name(ancestor::*[1]/preceding-sibling::*[1])" />)</h1>

        ---wenn man weis wie man dem Browser mitteilt das dann z.B. farbe="spanisch-habsburg" die farbe #666 ist.

        per xslt, etwa so:
         <xsl:variable name="farben" select="../../mann/@farbe" />
         <xsl:variable name="vater">background:#
         xsl:choose
          <xsl:when test="$farben='spanisch-habsburg'">666</xsl:when>
         <xsl:when test="$farben='lothringen'">ddd</xsl:when>
         xsl:otherwisefff</xsl:otherwise>
         </xsl:choose>
         </xsl:variable>

        grüße
        thomas

        ps: deine xslt datei habe ich auf deine mail zugeschickt

        1. Hallo Thomas!

          Besten Dank fuer Deine ausfuehrlichen Erklaerungen und Deine schoenen Vorlagen.
          Mit dem "." hast Du vollkommen recht, da gibt es viel zum aufraeumen.

          gruesse
          josef

          ps.
          das mail muß ich mir erst anschauen.