Masipulami: Problem mit XML

Hallo zusammen,

bin noch ziemlich neu auf dem Gebiet XML und hab hier gleich ein Problem.

Ich verlink mein Problem einfach mal aus nem anderen Forum, in dem ich das schon gestellt habe:
http://www.dvdboard.de/forum/showpost.php?p=819797&postcount=16

Wo könnte denn das Problem liegen, dass der Markenname nicht mit angezeigt wird?

Viele Grüße,
Masipulami

  1. Ah, hab den Fehler gerade selbst gefunden.

    Hier

    <td> <xsl:apply-templates select="preis | adresse | ps | EZ | art | farbe | kilometer | extras"/> </td>

    waren die td´s zu viel.

    So. Das läuft ja jetzt schon mal so wie´s soll.

    Jetzt komm ich zum eigentlichen Problem. Da hab ich echt absolut keine Ahnung, wie ich das angehen soll.

    Die Autos sollen jetzt auch noch alle einen Link bekommen.
    Wenn der angeklickt wird, sollen nur noch die Daten dieses Autos angezeigt werden und die dann halt in so einer vertikalen Tabellenstruktur:
    http://www.autoscout24.de/home/index...sg_detail_bild

    Wie mach ich das denn?

    1. Hallo,

      Jetzt komm ich zum eigentlichen Problem. Da hab ich echt absolut keine Ahnung, wie ich das angehen soll.

      Die Autos sollen jetzt auch noch alle einen Link bekommen.
      Wenn der angeklickt wird, sollen nur noch die Daten dieses Autos angezeigt werden und die dann halt in so einer vertikalen Tabellenstruktur:
      http://www.autoscout24.de/home/index...sg_detail_bild

      Wie mach ich das denn?

      Erstens macht du das bitte so, dass die Informationen die wir brauchen um dir zu helfen, zur Verfügung stehen: die Adresse: http://www.autoscout24.de/home/index...sg_detail_bild gibt es nicht (verlinke bitte richtig: http://www.autoscout24.de/home/index/detail.asp?ts=4686133&id=zinzg1qdqmy&source=as24_inseratsg_detail_bild)

      Wenn du keine serverseitige Transformation einsetzen kannst, wird deine 4. Anforderung :
      ------------
      "4.) Jedes Auto bekommt noch einen eigenen Link. Wird dieser angeklickt, sollen nur noch die Daten genau dieses Autos auf einer neuen Seite ausgegeben werden. Diese Daten sollen dann auch anders angeordnet sein."
      ------------

      nicht erfüllbar sein.
      Du hast aber mehrere Möglichkeiten:
      Du erzeugt mit deinem XSL alle benötigte Tabellen, als auch die, die für die Detailansicht gedacht sind.
      Du setzt alle Tabellen in <div>s und stellst erstmal die mit Detailansicht via CSS auf display:none;.
      Mir einer JavaScript-Funktion blendest du dann beim Klick auf dem Link das <div> der Übersichtstabelle aus und die gewünschte Detailtabelle ein.

      Die andere Möglichkeit, dass du etwas mehr scriptest und versuchst mit AJAX die feweilige Daten aus dem XML darzustellen:
      Ähnlich wie hier: http://forum.de.selfhtml.org/archiv/2005/1/t97848/#m597247 oder hier http://forum.de.selfhtml.org/archiv/2004/4/t78019/#m451662 beschrieben .

      Grüße
      Thomas

      1. Super, danke schon mal für die Hilfe.
        Ich denke ich werd das mit dem Ein- und Ausblenden der verschiedenen Tabellen über JavaScript mal versuchen.

        Fragen:
        1.) Wie müssen denn dann die Tags in der XML-Datei für die Links aussehen?
        2.) Wie mach ich das denn, dass die Tabelle immer nur mit den Daten des Autos gefüllt wird, dass gerade angeklickt wurde?
        Ich kann ja schlecht für alle Autos eine eigene Tabelle mit den Daten erstellen. Wenn das dann z.B. 100 Autos wären, bräuchte ich ja 100 Tabellen?

        1. Mal anders gefragt.

          Geht das nicht auch so, dass ich in meinem XSL-File ein eigenes Template anlege für die Ausgabe der Daten EINES Autos und dass ich dann dieses Template in meinem jeweiligen Autolink in der XML verlinke?

          Nur wie geht das?
          Und woher weiß das Template dann welche Daten es ausgeben muss. Sind ja dann nur die Daten des Schiffes, das ich angeklickt habe.

          1. Hallo,

            ------
            Ich kann ja schlecht für alle Autos eine eigene Tabelle mit den Daten erstellen. Wenn das dann z.B. 100 Autos wären, bräuchte ich ja 100 Tabellen?
            ------

            Doch, genau das wäre die Folge und der Nachteil des Vorschlages (bis auf das, dass es für dich reicht, wenn du nur 'eine' Tabelle erstellst. XSLT generiert dann automatisch alle anderen.
            z.B. sowas generiert für jede Auto eine Tabelle:
            <xsl:template match="auto">
             <div id="{generate-id()}">
              <table>
               ...
              </table>
             </div>
            </xsl:template>

            Im JavaScript brauchst du dann nur die entsprechende ID an die Funktion zu übergeben.

            Mal anders gefragt.

            Geht das nicht auch so, dass ich in meinem XSL-File ein eigenes Template anlege für die Ausgabe der Daten EINES Autos und dass ich dann dieses Template in meinem jeweiligen Autolink in der XML verlinke?

            Nur wie geht das?

            Nein. Du kannst kein XSLT-Template in HTML verlinken.
            Du kannst paramter an dein Stylesheet übergeben, aber auch das geht nur mit JavaScript und dafür - d.h. wie das geht - habe ich dir die zwei Beiträge aus dem Archiv verlinkt.

            Und woher weiß das Template dann welche Daten es ausgeben muss. Sind ja dann nur die Daten des Schiffes, das ich angeklickt habe.

            Sind es nun Autos oder Schiffe?? ;-)
            Ansonten siehe oben: via Paramterübergabe und wie gesagt mit AJAX kannst du das auch erreichen.
            Ich weiss nicht wie dringend du diese Sachen für deine Klausur brauchst, d.h. je nach deiner Zeit muss du die Varianten wählen, die dir am besten passt.

            Hier jetzt ein schnell gemachter Code:

            Grüße
            Thomas
            ---------------------------------------------------
            <?xml version="1.0" encoding="ISO-8859-1"?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
             <xsl:template match="/">
              <html>
               <head>
                <title>Autoliste</title>
                <style type="text/css">
                 .einzeln { display:none; }
                </style>
                <script type="text/javascript">
                 var arrAutos = new Array(<xsl:apply-templates select="autos" mode="jsarray" />);
                 <![CDATA[
                 function displayLayer(strID) {
                  document.getElementById(strID).style.display = "block";
                 }

            function hideLayer(strID) {
                  document.getElementById(strID).style.display = "none";
                 }

            function showAuto(strID) {
                  for(i=0; i<=arrAutos.length-1; i++) {
                   if(arrAutos[i] != strID) {
                    hideLayer(arrAutos[i]);
                   }
                   else
                    displayLayer(strID);
                  }
                 }
                 ]]>
                </script>
               </head>
               <body>
                <xsl:apply-templates select="autos" mode="alle" />
                <hr />
                <xsl:apply-templates select="autos" mode="einzeln" />
               </body>
              </html>
             </xsl:template>

            <xsl:template match="autos" mode="alle">
              <h1>Autoliste</h1>
              <p/>
              <table border="1">
               <tr>
                <th>Nr.</th>
                <th>Foto</th>
                <th>Marke</th>
                <th>Preis</th>
                <th>Adresse</th>
                <th>PS</th>
                <th>Erstzulassung</th>
                <th>Bauart</th>
                <th>Farbe</th>
                <th>Kilometerleistung</th>
                <th>Extras</th>
               </tr>
               <xsl:apply-templates select="auto[marke='Maserati']" mode="alle"/>
              </table>
             </xsl:template>

            <xsl:template match="auto" mode="alle">
              <xsl:variable name="ID" select="generate-id(.)" />
              <tr>
               <td>
                <xsl:number format="1"/>
               </td>
               <td>
                <xsl:apply-templates select="foto"/>
               </td>
               <td>
                <a href="#" onclick="showAuto('{$ID}')"><xsl:value-of select="marke" /></a>
               </td>
               <xsl:apply-templates select="preis | adresse | ps | EZ | art | farbe | kilometer | extras" mode="alle"/>
              </tr>
             </xsl:template>

            <xsl:template match="foto">
              <img align="left">
               <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>
              </img>
             </xsl:template>

            <xsl:template match="preis | adresse | ps | EZ | art | farbe | kilometer | extras" mode="alle">
              <td>
               <xsl:value-of select="."/>
                 </td>
              </xsl:template>

            <xsl:template match="autos" mode="einzeln">
               <xsl:apply-templates select="auto" mode="einzeln" />
              </xsl:template>
              <xsl:template match="auto" mode="einzeln">
               <div id="{generate-id(.)}" class="einzeln">
               <table border="1">
                <tr>
                 <th colspan="3">
                  <xsl:value-of select="marke" />
                 </th>
                </tr>
                <tr>
                 <td>Preis</td>
                 <td><xsl:value-of select="preis" /></td>
                 <td rowspan="8">
                  <xsl:apply-templates select="foto"/>
                 </td>
                </tr>
                <tr>
                 <td>Adresse</td>
                 <td><xsl:value-of select="adresse" /></td>
                </tr>
                <tr>
                 <td>PS</td>
                 <td><xsl:value-of select="ps" /></td>
                </tr>
                <tr>
                 <td>Erstzulassung</td>
                 <td><xsl:value-of select="EZ" /></td>
                </tr>
                <tr>
                 <td>Bauart</td>
                 <td><xsl:value-of select="art" /></td>
                </tr>
                <tr>
                 <td>Farbe</td>
                 <td><xsl:value-of select="farbe" /></td>
                </tr>
                <tr>
                 <td>Kilometerleistung</td>
                 <td><xsl:value-of select="kilometer" /></td>
                </tr>
                <tr>
                 <td>Extras</td>
                 <td><xsl:value-of select="extras" /></td>
                </tr>
               </table>
              </div>
              </xsl:template>
              <xsl:template match="autos" mode="jsarray">
               <xsl:for-each select="auto">
               xsl:text"</xsl:text><xsl:value-of select="generate-id(.)" />xsl:text"</xsl:text><xsl:if test="position() != last()">xsl:text, </xsl:text></xsl:if>
              </xsl:for-each>
              </xsl:template>
            </xsl:stylesheet>

            1. Super. Genau so wollte ich das.
              Danke dir!!!

              Habs selbst einfach nicht hinbekommen, aber wenn ich mir den Code so ansehe macht das alles Sinn.

              Noch eine Frage:
              Wie muss ich denn den Code abändern, damit der die Einzelansicht neu im aktuellen Fenster anzeigt (also dann halt nur noch die Einzelansicht und nicht unter die Ursprungstabelle).

              P.S.:
              Sind natürlich Autos. Keine Schiffe. Da hab ich mich nur verschrieben.

              1. Hallo,

                Super. Genau so wollte ich das.
                Danke dir!!!

                Bitte ;-)

                Habs selbst einfach nicht hinbekommen, aber wenn ich mir den Code so ansehe macht das alles Sinn.

                Noch eine Frage:
                Wie muss ich denn den Code abändern, damit der die Einzelansicht neu im aktuellen Fenster anzeigt (also dann halt nur noch die Einzelansicht und nicht unter die Ursprungstabelle).

                Z.B. so:

                Grüße
                Thomas
                ------------------------------------------------------------------------
                <?xml version="1.0" encoding="ISO-8859-1"?>
                <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                 <xsl:template match="/">
                  <html>
                   <head>
                    <title>Autoliste</title>
                    <style type="text/css">
                     .einzeln { display:none; }
                    </style>
                    <script type="text/javascript">
                     var arrAutos = new Array(<xsl:apply-templates select="autos" mode="jsarray" />);
                     var autosTabelle = "<xsl:value-of select="generate-id(autos)" />";
                     <![CDATA[
                     function displayLayer(strID) {
                      document.getElementById(strID).style.display = "block";
                     }

                function hideLayer(strID) {
                      document.getElementById(strID).style.display = "none";
                     }

                function showAuto(strID) {
                      for(i=0; i<=arrAutos.length-1; i++) {
                       if(arrAutos[i] != strID) {
                        hideLayer(arrAutos[i]);
                       }
                       else
                        displayLayer(strID);
                      }
                     }
                     ]]>
                    </script>
                   </head>
                   <body>
                    <xsl:apply-templates select="autos" mode="alle" />
                    <xsl:apply-templates select="autos" mode="einzeln" />
                   </body>
                  </html>
                 </xsl:template>

                <xsl:template match="autos" mode="alle">
                  <div id="{generate-id(.)}">
                   <h1>Autoliste</h1>
                   <p/>
                   <table border="1">
                    <tr>
                     <th>Nr.</th>
                     <th>Foto</th>
                     <th>Marke</th>
                     <th>Preis</th>
                     <th>Adresse</th>
                     <th>PS</th>
                     <th>Erstzulassung</th>
                     <th>Bauart</th>
                     <th>Farbe</th>
                     <th>Kilometerleistung</th>
                     <th>Extras</th>
                    </tr>
                    <xsl:apply-templates select="auto[marke='Maserati']" mode="alle"/>
                   </table>
                  </div>
                 </xsl:template>

                <xsl:template match="auto" mode="alle">
                  <xsl:variable name="ID" select="generate-id(.)" />
                  <tr>
                   <td>
                    <xsl:number format="1"/>
                   </td>
                   <td>
                    <xsl:apply-templates select="foto"/>
                   </td>
                   <td>
                    <a href="#" onclick="hideLayer(autosTabelle);showAuto('{$ID}');"><xsl:value-of select="marke" /></a>
                   </td>
                   <xsl:apply-templates select="preis | adresse | ps | EZ | art | farbe | kilometer | extras" mode="alle"/>
                  </tr>
                 </xsl:template>

                <xsl:template match="foto">
                  <img align="left">
                   <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>
                  </img>
                 </xsl:template>

                <xsl:template match="preis | adresse | ps | EZ | art | farbe | kilometer | extras" mode="alle">
                  <td>
                   <xsl:value-of select="."/>
                     </td>
                  </xsl:template>

                <xsl:template match="autos" mode="einzeln">
                   <xsl:apply-templates select="auto" mode="einzeln" />
                  </xsl:template>
                  <xsl:template match="auto" mode="einzeln">
                   <div id="{generate-id(.)}" class="einzeln">
                   <table border="1">
                    <tr>
                     <th colspan="3">
                      <xsl:value-of select="marke" />
                     </th>
                    </tr>
                    <tr>
                     <td>Preis</td>
                     <td><xsl:value-of select="preis" /></td>
                     <td rowspan="8">
                      <xsl:apply-templates select="foto"/>
                     </td>
                    </tr>
                    <tr>
                     <td>Adresse</td>
                     <td><xsl:value-of select="adresse" /></td>
                    </tr>
                    <tr>
                     <td>PS</td>
                     <td><xsl:value-of select="ps" /></td>
                    </tr>
                    <tr>
                     <td>Erstzulassung</td>
                     <td><xsl:value-of select="EZ" /></td>
                    </tr>
                    <tr>
                     <td>Bauart</td>
                     <td><xsl:value-of select="art" /></td>
                    </tr>
                    <tr>
                     <td>Farbe</td>
                     <td><xsl:value-of select="farbe" /></td>
                    </tr>
                    <tr>
                     <td>Kilometerleistung</td>
                     <td><xsl:value-of select="kilometer" /></td>
                    </tr>
                    <tr>
                     <td>Extras</td>
                     <td><xsl:value-of select="extras" /></td>
                    </tr>
                   </table>
                   <p>
                    <a href="#" onclick="hideLayer('{generate-id(.)}');displayLayer(autosTabelle);">Tabelle Anzeigen</a>
                   </p>
                  </div>
                  </xsl:template>
                  <xsl:template match="autos" mode="jsarray">
                   <xsl:for-each select="auto">
                   xsl:text"</xsl:text><xsl:value-of select="generate-id(.)" />xsl:text"</xsl:text><xsl:if test="position() != last()">xsl:text, </xsl:text></xsl:if>
                  </xsl:for-each>
                  </xsl:template>
                </xsl:stylesheet>

                1. Perfekt. Genau so solls sein.
                  Hast mir echt sehr geholfen. :)

                  1. Geht das eigentlich auch, dass ich mir zuerst alle Autos anzeigen lasse und dann in der Gesamtübersicht nen Link anklicke, der mir dann nur noch die Maseratis in ner Gesamtübersicht anzeigt?

                    Also so wie´s bis jetzt ist nur, dass noch ne Gesamtübersicht mit allen Autos vorgeschaltet ist.

                    Hab jetzt folgenden XML-Code:

                    <?xml version="1.0"?> <?xml-stylesheet href="autos_xsl.xsl" type="text/xsl" ?>

                    <autos>  <auto>   <marke xml:link="simple" naechster="Maserati" href="mas1.xml">Maserati</marke>   <modell>Biturbo Coupé</modell>   <foto quelle="Maserati1.jpg"></foto>   <foto2 quelle="Maserati1_gross.jpg"></foto2>   <preis>EUR 1.111</preis>   <adresse>    <name>Helmut Müller</name>    <strasse>Schustereck 5</strasse>    <plz>66709</plz>    <ort>Rappweiler</ort>   </adresse>   <ps>75</ps>   <EZ>06/1984</EZ>   <art>Coupé</art>   <farbe>schwarz</farbe>   <kilometer>100.000km</kilometer>   <extras>/</extras>   <kraftstoff>Benzin</kraftstoff>   <getriebe>Automatik</getriebe>  </auto>

                    <auto>   <marke xml:link="simple" naechster="Audi" href="audi.xml">Audi</marke>   <modell>Audi A8</modell>   <foto quelle="Audi.jpg"></foto>   <foto2 quelle="Audi_gross.jpg"></foto2>   <preis>EUR 12.000</preis>   <adresse>    <name>Donald Duck</name>    <strasse>Feldweg 3</strasse>    <plz>54621</plz>    <ort>Entenhausen</ort>   </adresse>   <ps>125</ps>   <EZ>10/2001</EZ>   <art>4-Türer</art>   <farbe>silber</farbe>   <kilometer>40.000km</kilometer>   <extras>Klimaanlage     <extra>Automatik</extra>     <extra>Nebelscheinwerfer</extra>     <extra>Sitzheizung</extra>   </extras>   <kraftstoff>Benzin</kraftstoff>   <getriebe>Handschaltung</getriebe>  </auto>

                    <auto>   <marke xml:link="simple" naechster="Maserati" href="mas2.xml">Maserati</marke>   <modell>Maserati Sportswagon</modell>   <foto quelle="Maserati2.jpg"></foto>   <foto2 quelle="Maserati2_gross.jpg"></foto2>   <preis>EUR 87.000</preis>   <adresse>    <name>Fred Feuerstein</name>    <strasse>Steinbruch 5</strasse>    <plz>66679</plz>    <ort>Losheim am See</ort>   </adresse>   <ps>340</ps>   <EZ>05/2005</EZ>   <art>Cabrio</art>   <farbe>blau</farbe>   <kilometer>25.000km</kilometer>   <extras>Klimaanlage     <extra>Automatik</extra>     <extra>Nebelscheinwerfer</extra>     <extra>Sitzheizung</extra>     <extra>Ledersitze</extra>   </extras>   <kraftstoff>Benzin</kraftstoff>   <getriebe>Handschaltung</getriebe>  </auto> </autos>

                    Mein XSL-Code:

                    <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="/">   <html>    <head>     <title>Autoliste</title>

                    <style type="text/css">      .einzeln { display:none; }

                    th   {   background-color: #B4CEA7;   }

                    .spalte   {    background-color: #B4CEA7;    font-weight: bold;    width=140;   }

                    .daten     {    background-color: #F7F9C1;    width=100;   }

                    </style>

                    <script type="text/javascript">      var arrAutos = new Array(<xsl:apply-templates select="autos" mode="jsarray" />);      var autosTabelle = "<xsl:value-of select="generate-id(autos)" />";      <![CDATA[      function displayLayer(strID)      {       document.getElementById(strID).style.display = "block";      }

                    function hideLayer(strID)      {       document.getElementById(strID).style.display = "none";      }

                    function showAuto(strID)      {         for(i=0; i<=arrAutos.length-1; i++) {         if(arrAutos[i] != strID)         {    hideLayer(arrAutos[i]);   }         else    displayLayer(strID);       }      }      ]]>     </script>    </head>    <body>     <xsl:apply-templates select="autos" mode="alle" />     <xsl:apply-templates select="autos" mode="einzeln" />    </body>   </html>  </xsl:template>

                    <xsl:template match="autos" mode="alle">   <div id="{generate-id(.)}">    <h1>Autoliste</h1>    <p/>    <table border="1">     <tr>      <th>Nr.</th>   <th>Foto</th>      <th>Marke</th>      <th>Modell</th>      <th>Preis</th>      <th>Adresse</th>      <th>PS</th>      <th>Erstzulassung</th>      <th>Bauart</th>      <th>Farbe</th>      <th>Kilometerleistung</th>      <th>Extras</th>     </tr>     <xsl:apply-templates select="auto[marke='Maserati']" mode="alle"/>    </table>   </div>  </xsl:template>

                    <xsl:template match="auto" mode="alle">   <xsl:variable name="ID" select="generate-id(.)" />   <tr>    <td>     <xsl:number format="1"/>    </td>    <td>     <xsl:apply-templates select="foto"/>    </td>    <td align="center" width="90">     <a href="#" onclick="hideLayer(autosTabelle);showAuto('{$ID}');"><xsl:value-of select="marke" /></a>    </td>    <xsl:apply-templates select="modell | preis" mode="alle"/>    <xsl:apply-templates select="adresse" mode="alle"/>    <xsl:apply-templates select="ps | EZ | art | farbe | kilometer | extras" mode="alle"/>   </tr>  </xsl:template>

                    <xsl:template match="foto">   <img align="left">    <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>   </img>  </xsl:template>

                    <xsl:template match="foto2">   <img align="center">    <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>   </img>  </xsl:template>

                    <xsl:template match="modell | preis" mode="alle">   <td>    <xsl:value-of select="."/>    </td>   </xsl:template>

                    <xsl:template match="adresse" mode="alle">  <td>    <xsl:value-of select="plz"/><br></br>    <xsl:value-of select="ort"/>  </td>  </xsl:template>

                    <xsl:template match="ps | EZ | art | farbe | kilometer | extras" mode="alle">   <td>    <xsl:value-of select="."/>      </td>   </xsl:template>

                    <xsl:template match="autos" mode="einzeln">    <xsl:apply-templates select="auto" mode="einzeln" />   </xsl:template>

                    <xsl:template match="auto" mode="einzeln">    <div id="{generate-id(.)}" class="einzeln">    <table border="1">     <tr>      <th colspan="3">       <xsl:value-of select="modell" />      </th>     </tr>     <tr>      <td class="spalte">Preis</td>      <td class="daten"><xsl:value-of select="preis" /></td>      <td rowspan="10" width="400"  align="center">       <xsl:apply-templates select="foto2"/>      </td>     </tr>     <tr>      <td class="spalte">Adresse</td>    <xsl:apply-templates select="adresse" mode="einzeln"/>     </tr>     <tr>      <td class="spalte">PS</td>      <td class="daten"><xsl:value-of select="ps" /></td>     </tr>     <tr>      <td class="spalte">Erstzulassung</td>      <td class="daten"><xsl:value-of select="EZ" /></td>     </tr>     <tr>      <td class="spalte">Bauart</td>      <td class="daten"><xsl:value-of select="art" /></td>     </tr>     <tr>      <td class="spalte">Farbe</td>      <td class="daten"><xsl:value-of select="farbe" /></td>     </tr>     <tr>      <td class="spalte">Kilometerleistung</td>      <td class="daten"><xsl:value-of select="kilometer" /></td>     </tr>     <tr>      <td class="spalte">Extras</td>      <td class="daten"><xsl:value-of select="extras" /></td>     </tr>     <tr>      <td class="spalte">Kraftstoffart</td>      <td class="daten"><xsl:value-of select="kraftstoff" /></td>     </tr>     <tr>      <td class="spalte">Getriebe</td>      <td class="daten"><xsl:value-of select="getriebe" /></td>     </tr>    </table>    <p>     <a href="#" onclick="hideLayer('{generate-id(.)}');displayLayer(autosTabelle);">Gesamtübersicht anzeigen</a>    </p>   </div>   </xsl:template>

                    <xsl:template match="adresse" mode="einzeln">  <td class="daten">    <xsl:value-of select="name"/><br></br>    <xsl:value-of select="plz"/><br></br>    <xsl:value-of select="ort"/>  </td>  </xsl:template>

                    <xsl:template match="autos" mode="jsarray">    <xsl:for-each select="auto">    xsl:text"</xsl:text><xsl:value-of select="generate-id(.)" />xsl:text"</xsl:text><xsl:if test="position() != last()">xsl:text, </xsl:text></xsl:if>   </xsl:for-each>   </xsl:template> </xsl:stylesheet>

                    Hab beide Codes ein wenig angepasst. Jetzt siehts halt optisch schöner aus und in der Einzelansicht werden mehr Infos angezeigt als in der Gesamtansicht.

                    Und wieder die Frage: Wie muss ich meinen XSL-Code anpassen, damit das so klappt, wie ich das oben beschrieben habe? Hab schon fast zwei Stunden dran rumgedoktort, aber ich bekomms einfach nicht zum Laufen.

                    Viele Grüße, Masipulami

                    1. Noch besser wäre natürlich ein kleines Pulldown-Menü auf der Übersichtsseite aller Autos.
                      Da könnte man dann Maserati oder Audi oder was auch immer auswählen und dann würden in der nächsten Übersicht nur noch die Maseratis/Audis angezeigt werden und dann bei nem Klick halt wieder die Einzelansichten.

                      Falls sich das überhaupt mit JavaScript realisieren lässt.

                      Wenn ich den Code sehe wird mir das immer klar und dann kann ichs fürs nächste mal auch meistens anwenden, aber ich komm halt gerade nicht allein auf die Lösung.

                      1. Hallo,

                        Noch besser wäre natürlich ein kleines Pulldown-Menü auf der Übersichtsseite aller Autos. Da könnte man dann Maserati oder Audi oder was auch immer auswählen und dann würden in der nächsten Übersicht nur noch die Maseratis/Audis angezeigt werden und dann bei nem Klick halt wieder die Einzelansichten.

                        Falls sich das überhaupt mit JavaScript realisieren lässt.

                        Ja und ich habe mir schon gestern gedacht, dass diese Anfrage kommt ;-)

                        Wenn ich den Code sehe wird mir das immer klar und dann kann ichs fürs nächste mal auch meistens anwenden, aber ich komm halt gerade nicht allein auf die Lösung.

                        Hmm ... aber wenn du jetzt sagst, dass du eigentlich auch noch auf die verlinkten XML-Dokumente (xml:link="simple" naechster="Maserati" href="mas2.xml") zugreifen und diese Darstellen willst ...  also irgendwas muss du dann auch selbst für deine Klasur tun ;-)

                        Grüße Thomas


                        <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="markenauswahl" match="auto" use="marke" />  <xsl:template match="/">   <html>    <head>     <title>Autoliste</title>

                        <style type="text/css">      .einzeln { display:none; }   .markentabelle  { display:none; }   th   {   background-color: #B4CEA7;   }

                        .spalte   {    background-color: #B4CEA7;    font-weight: bold;    width=140;   }

                        .daten     {    background-color: #F7F9C1;    width=100;   }

                        </style>

                        <script type="text/javascript">      var arrAutos = new Array(<xsl:apply-templates select="autos" mode="jsarray" />);      var arrAutosTabelle = new Array(<xsl:apply-templates select="autos" mode="markejsarray" />);

                        <![CDATA[      function displayLayer(strID)      {       document.getElementById(strID).style.display = "block";      }

                        function hideLayer(strID)      {       document.getElementById(strID).style.display = "none";      }

                        function showAuto(strArrayName, strID) {    for(i=0; eval("i<= " + strArrayName + ".length-1"); i++) {     if(eval(strArrayName + "[i] != strID")) {      hideLayer(eval(strArrayName + "[i]"));     }     else      displayLayer(strID);    }   }

                        function hideSingleAutos() {       for(i=0; i<=arrAutos.length-1; i++) {     hideLayer(arrAutos[i]);    }   }      ]]>     </script>    </head>    <body>     <form action="#">   <select onchange="showAuto('arrAutosTabelle', this.form.markenauswahl.options[this.form.markenauswahl.selectedIndex].value); hideSingleAutos();" name="markenauswahl">    <option>Wählen Sie eine Marke</option>    <xsl:for-each select="autos/auto[generate-id() = generate-id(key('markenauswahl', marke)[1])]">     <xsl:sort select="marke" />     <option value="marke_{generate-id()}"><xsl:value-of select="marke" /></option>    </xsl:for-each>   </select>  </form>     <xsl:apply-templates select="autos" mode="alle" />     <xsl:apply-templates select="autos" mode="einzeln" />    </body>   </html>  </xsl:template>

                        <xsl:template match="autos" mode="alle">  <xsl:for-each select="auto[generate-id() = generate-id(key('markenauswahl', marke)[1])]">   <xsl:variable name="strLayerID" select="generate-id()" />   <xsl:variable name="automarke" select="marke" />     <div id="marke_{generate-id(.)}" class="markentabelle">    <h1>Autoliste</h1>    <p/>     <table border="1">      <tr>       <th>Nr.</th>       <th>Foto</th>       <th>Marke</th>       <th>Modell</th>       <th>Preis</th>       <th>Adresse</th>       <th>PS</th>       <th>Erstzulassung</th>       <th>Bauart</th>       <th>Farbe</th>       <th>Kilometerleistung</th>      <th>Extras</th>     </tr>     <xsl:apply-templates select="key('markenauswahl', $automarke)" mode="alle">      <xsl:with-param name="strLayerID" select="$strLayerID" />     </xsl:apply-templates>    </table>    </div>  </xsl:for-each> </xsl:template>

                        <xsl:template match="auto" mode="alle">  <xsl:param name="strLayerID" />   <xsl:variable name="ID" select="generate-id(.)" />   <tr>    <td>     <xsl:number format="1"/>    </td>    <td>     <xsl:apply-templates select="foto"/>    </td>    <td align="center" width="90">     <a href="#" onclick="hideLayer('marke_{$strLayerID}');showAuto('arrAutos', '{$ID}');"><xsl:value-of select="marke" /></a>    </td>    <xsl:apply-templates select="modell | preis" mode="alle"/>    <xsl:apply-templates select="adresse" mode="alle"/>    <xsl:apply-templates select="ps | EZ | art | farbe | kilometer | extras" mode="alle"/>   </tr>  </xsl:template>

                        <xsl:template match="foto">   <img align="left">    <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>   </img>  </xsl:template>

                        <xsl:template match="foto2">   <img align="center">    <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>   </img>  </xsl:template>

                        <xsl:template match="modell | preis" mode="alle">   <td>    <xsl:value-of select="."/>    </td>   </xsl:template>

                        <xsl:template match="adresse" mode="alle">  <td>    <xsl:value-of select="plz"/><br></br>    <xsl:value-of select="ort"/>  </td>  </xsl:template>

                        <xsl:template match="ps | EZ | art | farbe | kilometer | extras" mode="alle">   <td>    <xsl:value-of select="."/>      </td>   </xsl:template>

                        <xsl:template match="autos" mode="einzeln">    <xsl:apply-templates select="auto" mode="einzeln" />   </xsl:template>

                        <xsl:template match="auto" mode="einzeln">    <xsl:variable name="strLayerID" select="generate-id(key('markenauswahl', marke)[1])" />    <div id="{generate-id(.)}" class="einzeln">    <table border="1">     <tr>      <th colspan="3">       <xsl:value-of select="modell" />      </th>     </tr>     <tr>      <td class="spalte">Preis</td>      <td class="daten"><xsl:value-of select="preis" /></td>      <td rowspan="10" width="400"  align="center">       <xsl:apply-templates select="foto2"/>      </td>     </tr>     <tr>      <td class="spalte">Adresse</td>    <xsl:apply-templates select="adresse" mode="einzeln"/>     </tr>     <tr>      <td class="spalte">PS</td>      <td class="daten"><xsl:value-of select="ps" /></td>     </tr>     <tr>      <td class="spalte">Erstzulassung</td>      <td class="daten"><xsl:value-of select="EZ" /></td>     </tr>     <tr>      <td class="spalte">Bauart</td>      <td class="daten"><xsl:value-of select="art" /></td>     </tr>     <tr>      <td class="spalte">Farbe</td>      <td class="daten"><xsl:value-of select="farbe" /></td>     </tr>     <tr>      <td class="spalte">Kilometerleistung</td>      <td class="daten"><xsl:value-of select="kilometer" /></td>     </tr>     <tr>      <td class="spalte">Extras</td>      <td class="daten"><xsl:value-of select="extras" /></td>     </tr>     <tr>      <td class="spalte">Kraftstoffart</td>      <td class="daten"><xsl:value-of select="kraftstoff" /></td>     </tr>     <tr>      <td class="spalte">Getriebe</td>      <td class="daten"><xsl:value-of select="getriebe" /></td>     </tr>    </table>    <p>     <a href="#" onclick="hideLayer('{generate-id(.)}');displayLayer('marke_{$strLayerID}');">Gesamtübersicht anzeigen</a>    </p>   </div>   </xsl:template>

                        <xsl:template match="adresse" mode="einzeln">  <td class="daten">    <xsl:value-of select="name"/><br></br>    <xsl:value-of select="plz"/><br></br>    <xsl:value-of select="ort"/>  </td>  </xsl:template>

                        <xsl:template match="autos" mode="jsarray">    <xsl:for-each select="auto">    xsl:text"</xsl:text><xsl:value-of select="generate-id(.)" />xsl:text"</xsl:text><xsl:if test="position() != last()">xsl:text, </xsl:text></xsl:if>   </xsl:for-each>   </xsl:template>   <xsl:template match="autos" mode="markejsarray">    <xsl:for-each select="auto[generate-id() = generate-id(key('markenauswahl', marke)[1])]">   xsl:text"</xsl:text><xsl:value-of select="concat('marke_', generate-id(.))" />xsl:text"</xsl:text><xsl:if test="position() != last()">xsl:text, </xsl:text></xsl:if>  </xsl:for-each>   </xsl:template> </xsl:stylesheet>

                        1. Nein nein.
                          Das Verlinken auf die Mas2.xml etc. hab ich ja schon selbst hinbekommen.
                          Ich bin nur nicht so fit in JavaScript, dass ich das jetzt auf Anhieb selbst so hinbekommen hätte.

                          Dank dir weiß ich jetzt aber wie´s geht und dafür noch mal ein dickes Dankeschön!

                          1. So, nachdem das nun läuft, hab ich mich heute mal daran versucht das mittels PHP (also ohne XSLT) zu lösen:

                            Hier mal die PHP-Codes:

                            Für Ausgabe aller Autos:

                            <?php

                            $id = $_GET['id'];

                            if (file_exists("autos_php.xml")) {

                            $xml = simplexml_load_file("autos_php.xml");

                            $path ="/autos/auto";

                            if (!$res = $xml->xpath($path)) {
                            echo "Auto nicht vorhanden!";
                            }
                            else {
                            echo "<table border="1">";
                            echo "<tr>";
                            echo "<th>Marke</th>";
                            echo "<th>Modell</th>";
                            echo "<th>Preis</th>";
                            echo "<th>Adresse</th>";
                            echo "</tr>";

                            foreach ($xml->xpath('auto') as $auto) {
                                  echo '<tr><td>', $auto->marke, '</td><td>', $auto->modell, '</td><td>', $auto->preis,'</td>';

                            foreach ($xml->xpath('//adresse') as $adresse) {
                                  echo '<td>', $adresse->name, $adresse->strasse, $adresse->ort,'</td></tr>';
                            }
                            else {
                            exit("Konnte Datei nicht laden.");
                            }
                            ?>

                            Und für die Daten eines Autos:

                            <?php

                            $id = $_GET['id'];

                            if (file_exists("autos_php.xml")) {

                            $xml = simplexml_load_file("autos_php.xml");

                            $path ="/autos/auto[@id=".$id."]";

                            if (!$res = $xml->xpath($path)) {
                            echo "Artikel nicht vorhanden!";
                            }
                            else {
                            echo "<table border="1">";
                            echo "<tr>";
                            echo "<td>Marke:</td>";
                            echo "<td>".$res[0]->marke."</td>";
                            echo "</tr>";

                            echo "<tr>";
                            echo "<td>Modell:</td>";
                            echo "<td>".$res[0]->modell."</td>";
                            echo "</tr>";

                            echo "<tr>";
                            echo "<td>Preis:</td>";
                            echo "<td>".$res[0]->preis."</td>";
                            echo "</tr>";

                            echo "<tr>";
                            echo "<td>Adresse:</td>";
                              echo "<td>";
                                foreach ($xml->xpath('//adresse') as $adresse) {
                                  echo $adresse->name, $adresse->strasse, $adresse->ort,'<br />';
                              echo "</td>";
                            echo "</tr>";

                            echo "<tr>";
                            echo "<td>PS:</td>";
                            echo "<td>".$res[0]->ps."</td>";
                            echo "</tr>";
                            }

                            }
                            else {
                            exit("Konnte Datei nicht laden.");
                            }
                            ?>

                            Läuft aber nicht auf meinem Apache. Also hab ich wohl was falsch.

                            Könntest du mir mal wieder auf die Sprünge helfen?
                            Was hab ich denn da schon wieder falsch?
                            Problem mit PHP ist, dass wir das nur ganz kurz angesprochen haben, aber diese Aufgabe für die Klausur auch mit PHP lösen müssen.
                            Zumindest so, dass erst ne Gesamtübersicht angezeigt wird und dann bei nem Klick auf eins der Autos wie gehabt ne Einzelübersicht kommt.

                            Die Einzelansicht wollte ich dann einfach so erzeugen lassen, dass bei dem Klick auf nen Link der Gesamtübersicht die ID des entsprechenden Autos mit an die PHP-Datei der Einzelübersicht geschickt wird und somit nur dieses Auto ausgegeben wird.

                            Das hier soll jetzt nur mal die Grobversion sein.
                            Da kommen später natürlich auch noch die anderen Daten hinzu.

                            Die Autos_php.xml hab ich nur soweit abgeändert, dass jedes Auto jetzt ne eigene ID hat.

                            Hier mal noch der angepasste XML-Code:

                            <?xml version="1.0"?>
                            <?xml-stylesheet href="autos_xsl.xsl" type="text/xsl" ?>

                            <autos>
                             <auto id="1">
                              <marke xml:link="simple" naechster="Maserati" href="mas1.xml">Maserati</marke>
                              <modell>Biturbo Coupé</modell>
                              <foto quelle="Maserati1.jpg"></foto>
                              <foto2 quelle="Maserati1_gross.jpg"></foto2>
                              <preis>EUR 1.111</preis>
                              <adresse>
                               <name>Helmut Müller</name>
                               <strasse>Schustereck 5</strasse>
                               <plz>66709</plz>
                               <ort>Rappweiler</ort>
                              </adresse>
                              <ps>75</ps>
                              <EZ>06/1984</EZ>
                              <art>Coupé</art>
                              <farbe>schwarz</farbe>
                              <kilometer>100.000km</kilometer>
                              <extras>keine</extras>
                              <kraftstoff>Benzin</kraftstoff>
                              <getriebe>Automatik</getriebe>
                             </auto>

                            <auto id="2">
                              <marke xml:link="simple" naechster="Audi" href="audi.xml">Audi</marke>
                              <modell>Audi A8</modell>
                              <foto quelle="Audi.jpg"></foto>
                              <foto2 quelle="Audi_gross.jpg"></foto2>
                              <preis>EUR 12.000</preis>
                              <adresse>
                               <name>Donald Duck</name>
                               <strasse>Feldweg 3</strasse>
                               <plz>54621</plz>
                               <ort>Entenhausen</ort>
                              </adresse>
                              <ps>125</ps>
                              <EZ>10/2001</EZ>
                              <art>4-Türer</art>
                              <farbe>silber</farbe>
                              <kilometer>40.000km</kilometer>
                              <extras>Klimaanlage
                                <extra>Automatik</extra>
                                <extra>Nebelscheinwerfer</extra>
                                <extra>Sitzheizung</extra>
                              </extras>
                              <kraftstoff>Benzin</kraftstoff>
                              <getriebe>Handschaltung</getriebe>
                             </auto>

                            <auto id="3">
                              <marke xml:link="simple" naechster="Maserati" href="mas2.xml">Maserati</marke>
                              <modell>Maserati Sportswagon</modell>
                              <foto quelle="Maserati2.jpg"></foto>
                              <foto2 quelle="Maserati2_gross.jpg"></foto2>
                              <preis>EUR 87.000</preis>
                              <adresse>
                               <name>Fred Feuerstein</name>
                               <strasse>Steinbruch 5</strasse>
                               <plz>66679</plz>
                               <ort>Losheim am See</ort>
                              </adresse>
                              <ps>340</ps>
                              <EZ>05/2005</EZ>
                              <art>Cabrio</art>
                              <farbe>blau</farbe>
                              <kilometer>25.000km</kilometer>
                              <extras>Klimaanlage
                                <extra>Automatik</extra>
                                <extra>Nebelscheinwerfer</extra>
                                <extra>Sitzheizung</extra>
                                <extra>Ledersitze</extra>
                              </extras>
                              <kraftstoff>Benzin</kraftstoff>
                              <getriebe>Handschaltung</getriebe>
                             </auto>
                            </autos>

                            1. Habs jetzt endlich mal selber hinbekommen:

                              Hab nur noch ein kleines Problem:
                              Da scheint was mit der Syntax des Links, der die ID an die Autos_einzeln.php übergibt, nicht zu stimmen.

                              Wär schön, wenn mir jemand den Fehler aufzeigen könnte.

                              Hier mal die beiden PHP-Codes:

                              Autos_alle.php:
                              (zeigt Gesamtübersicht aller Autos an)

                              <?php

                              $id = $_GET['id'];

                              if (file_exists("autos_php.xml"))
                              {

                              $xml = simplexml_load_file("autos_php.xml");

                              $path ="/autos/auto";

                              if (!$res = $xml->xpath($path))
                                  {
                                  echo "Auto nicht vorhanden!";
                                  }

                              else
                                  {
                                  echo "<table border="1">";
                                  echo "<tr>";
                                  echo "<th>Marke</th>";
                                  echo "<th>Modell</th>";
                                  echo "<th>Preis</th>";
                                  echo "<th>Adresse</th>";
                                  echo "<th>PS</th>";
                                  echo "<th>Erstzulassung</th>";
                                  echo "<th>Bauart</th>";
                                  echo "<th>Farbe</th>";
                                  echo "<th>Kilometerleistung</th>";
                                  echo "<th>Extras</th>";
                                  echo "<th>Link</th>";
                                  echo "</tr>";

                              foreach ($xml->xpath('auto') as $auto)
                                      {
                                      echo '<tr><td>', $auto->marke, '</td><td>', $auto->modell, '</td><td>', $auto->preis,'</td>';
                                      echo '<td>', $auto->adresse->name, '<br>', $auto->adresse->strasse, '<br>', $auto->adresse->ort,'</td>';
                                      echo '<td>', $auto->ps, '</td><td>', $auto->EZ, '</td><td>', $auto->art, '</td><td>', $auto->farbe, '</td><td>', $auto->kilometer, '</td>';
                                      echo '<td>', $auto->extras, '</td>';

                              echo "<td><A href="autos_einzeln.php">Link</A></td></tr>";
                                      }
                                  }
                              }
                              else
                              {
                              exit("Konnte Datei nicht laden.");
                              }
                              ?>

                              Autos_einzeln.php:
                              (zeigt die Einzelansicht des Autos mit der übergebenen ID an)

                              <?php

                              $id = $_GET['id'];
                              //$id = '1';

                              if (file_exists("autos_php.xml"))
                              {

                              $xml = simplexml_load_file("autos_php.xml");

                              $path ="/autos/auto[@id=".$id."]";
                                //$path ="/autos/auto['id']";

                              if (!$res = $xml->xpath($path))
                                {
                                  echo "Artikel nicht vorhanden!";
                                }
                                else
                                {
                                  echo "<table border="1">";
                                  echo "<tr>";
                                  echo "<td>Marke:</td>";
                                  echo "<td>".$res[0]->marke."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Modell:</td>";
                                  echo "<td>".$res[0]->modell."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Preis:</td>";
                                  echo "<td>".$res[0]->preis."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Adresse:</td>";
                                  echo "<td>".$res[0]->adresse->name."<br>".$res[0]->adresse->strasse."<br>".$res[0]->adresse->ort."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>PS:</td>";
                                  echo "<td>".$res[0]->ps."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Erstzulassung:</td>";
                                  echo "<td>".$res[0]->EZ."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Bauart:</td>";
                                  echo "<td>".$res[0]->art."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Farbe:</td>";
                                  echo "<td>".$res[0]->farbe."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Kilometerleistung:</td>";
                                  echo "<td>".$res[0]->kilometer."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Extras:</td>";
                                  echo "<td>".$res[0]->extras."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Kraftstoffart:</td>";
                                  echo "<td>".$res[0]->kraftstoff."</td>";
                                  echo "</tr>";

                              echo "<tr>";
                                  echo "<td>Getriebe:</td>";
                                  echo "<td>".$res[0]->getriebe."</td>";
                                  echo "</tr>";
                                }
                              }
                              else
                              {
                              exit("Konnte Datei nicht laden.");
                              }
                              ?>

                              Kann sich ja nur noch um ne Kleinigkeit handeln.

                              Viele Grüße und schönen Abend noch,
                              Masipulami

                              1. Hallo,

                                Habs jetzt endlich mal selber hinbekommen:

                                Fein, denn ich hätte dir bei PHP nicht sehr viel helfen können.

                                Hab nur noch ein kleines Problem:
                                Da scheint was mit der Syntax des Links, der die ID an die Autos_einzeln.php übergibt, nicht zu stimmen.

                                echo "<td><A href="autos_einzeln.php">Link</A></td></tr>";

                                Kann sich ja nur noch um ne Kleinigkeit handeln.

                                Ja, z.B. an der Kleinigkeit, dass du keine ID an "autos_einzeln.php" weitergibt:

                                "<td><A href="autos_einzeln.php -->?ID=x<---  ">Link</A></td></tr>";

                                Grüße
                                Thomas

                                1. Argh, ja natürlich. Danke!

  2. Hallo,

    bin noch ziemlich neu auf dem Gebiet XML und hab hier gleich ein Problem.

    Ich verlink mein Problem einfach mal aus nem anderen Forum, in dem ich das schon gestellt habe:
    http://www.dvdboard.de/forum/showpost.php?p=819797&postcount=16

    Wo könnte denn das Problem liegen, dass der Markenname nicht mit angezeigt wird?

    Das Problem liegt daran, dass du den Makrennamen niergendwo ausgibst!
    Wo soll der denn erschienen, wenn du für <marke> keine Ausgabe definiert hast?

    Grüße
    Thomas