Drej: XML Daten in XSL einbinden unter Benutzung von CSS

Hallo Community,

ich habe folgendes Problem.
Ich bin gerade dabei, eine Darstellung von XML Daten unter Berücksichtigung von CSS zu erstellen. Konkret bedeutet das, dass ich eine *.dtd und eine *.xml gegeben hatte und dafür die entsprechenden *.xsl und *.css Datei erstellt habe.
Nun stehe ich vor einem (bis jetzt nicht lösbarem) Problem:
----------------------------------------------------------------
<?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>bugZilla Fehleranalyse</title>
        <link rel="stylesheet" href="basic.css" type="text/css" media="screen, projection"/>
      </head>
      <body>
        <div id="container">
          <!-- Container header-->
          <!-- Anfang header-->
          <div id="header">
            <h1>.:. bugZilla fehleranalyse .:.</h1>
          </div>
          <div id="conlinks">Content Links</div>
          <div id="conrechts">Content Rechts</div>
          <div id="conmain">Content Main</div>
        </div>
        </body>
    </html>
  </xsl:template>
-----------------------------------------------------------------

Das hier ist die XSL-Datei, die erstellt wurde. Jetzt wollte ich, eine Ausgabe der einzelnen XML-Daten innerhalb der dafür vorgesehen div-Container hervorrufen.

Aus Tutorials etc. heraus dachte ich eigentlich, dass eine Programmierung wie folgt aussehen könnte:

<div id="conlinks"> Die XML-Daten sind: <xsl:template match="xmldaten"> <xsl:value-of select="." /> </xsl:template> </div>

Als Ausgabe erwartete ich dann eigentlich:

" Die XML-Daten sind: "->xmldaten" "

Als Fehlermeldung gab er mir dann "Das Schlüsselwort xsl:template kann hier nicht verwendet werden."

Ich probierte dann weiter alle mir ersichtlichen Möglichkeiten aus, bekam aber entweder weitere Fehler oder keinen Fehler aber auch keine Ausgabe.

Was mir aber Kopfschmerzen bereitet hat ist, dass wenn ich nur "<xsl:apply-templates />" egal an welcher Stelle des XSL-Dokumentes eingebe er mir die kompletten XML-Daten als Ausgabe gibt. Logischerweise ohne formatierung und hintereinander aufgelistet, aber er gibt mir eine Ausgabe. Ich kann die Daten auch unstrukturiert in jeden der Container ausgeben lassen (also conlinks, conrechts und conmain) aber ich bekomme keine einzelne XML-Datenausgabe hin. Mein eigentliches Ziel war, den verschiedenen Container unterschiedliche XML-Daten zuzuweisen, um sie optisch schön und geordnet wiederzugeben.

Ich bin eigtl mit meinem Latein am Ende. Evtl besteht das Problem darin, dass man CSS nicht mit XML / XSL in dieser Form verbinden kann, doch frage ich mich dann, warum er mir die Daten durch <xsl:apply templates> wiedergibt, aber nicht durch <xsl:value-of select...>.

Über Hilfe wäre ich überglücklich, damit ich das Projekt zur Zufriedenheit meiner Arbeitgeber zu Ende bringen kann.

Ich danke im Vorraus und bin zuversichtlich über eine (hoffentlich) simple und schnelle Lösung!

Mit freundlichen Grüßen,

Andrej G.

  1. Hallo,

    Nun stehe ich vor einem (bis jetzt nicht lösbarem) Problem:
    Das hier ist die XSL-Datei, die erstellt wurde. Jetzt wollte ich, eine Ausgabe der einzelnen XML-Daten innerhalb der dafür vorgesehen div-Container hervorrufen.

    Aus Tutorials etc. heraus dachte ich eigentlich, dass eine Programmierung wie folgt aussehen könnte:

    <div id="conlinks"> Die XML-Daten sind: <xsl:template match="xmldaten"> <xsl:value-of select="." /> </xsl:template> </div>

    Nein, dass kann nicht gehen. Wenn das so ein einem Tutorial stand, wirf den weg, dann ist der unbrauchbar.
    Du kannst nicht innterhalb eines xsl:template noch ein xsl:template definieren.

    Als Ausgabe erwartete ich dann eigentlich:
    " Die XML-Daten sind: "->xmldaten" "

    Ws erwartet du an der Stelle _genau_? Soll er die Werte aus dem XML ausgeben, oder soll er dir das XML als solches (sprich die Elemente, Attribute und Text) ausgeben? [1]

    Was mir aber Kopfschmerzen bereitet hat ist, dass wenn ich nur "<xsl:apply-templates />" egal an welcher Stelle des XSL-Dokumentes eingebe er mir die kompletten XML-Daten als Ausgabe gibt. Logischerweise ohne formatierung und hintereinander aufgelistet, aber er gibt mir eine Ausgabe.

    Das ist normal: du hast zwar keine Templates für die einzelnen XML-Elemente definiert, aber das heisst nicht, dass es keine Templates gibt. Es gibt nämlich die buil-in-Templates im XSL, die dann letztendlich den Textinhalt von den Elementen ausgeben und mit <xsl:apply-templates /> aktivierst du alle Templates: die, die du selbst definiert hast und auch die build-in Templates.

    Mein eigentliches Ziel war, den verschiedenen Container unterschiedliche XML-Daten zuzuweisen, um sie optisch schön und geordnet wiederzugeben.

    Definiere bitte diese Anforderunge genau. (siehe oben bei [1]!)

    Ich bin eigtl mit meinem Latein am Ende. Evtl besteht das Problem darin, dass man CSS nicht mit XML / XSL in dieser Form verbinden kann,

    Das hat damit nichts zu tun.

    doch frage ich mich dann, warum er mir die Daten durch <xsl:apply templates> wiedergibt, aber nicht durch <xsl:value-of select...>.

    <xsl:apply templates> habe ich erklärt, <xsl:value-of select> wählt den _ersten_ Knoten auf dem es zutrifft (bei dir konnte es zusätzlich wegen des verschachtelten xsl:template nicht funktionieren.
    Z.B. wenn du im XML so etewas stehen hast:
    <daten>
      <blubb>a</blubb>
      <blubb>b</blubb>
      <blubb>c</blubb>
      <blubb>d</blubb>
    </daten>

    und dann <xsl:value-of select="daten/blubb"> verwendets, bekommst immer nur "a" ausgegeben.

    Ich danke im Vorraus und bin zuversichtlich über eine (hoffentlich) simple und schnelle Lösung!

    Definiere bitte deine Anforderungen genauer.

    Grüße
    Thomas

    1. Hallo Thomas,

      erstmal danke für die Antwort. Ich werde mal versuchen, dir das Problem genauer zu erläutern.

      Ws erwartet du an der Stelle _genau_? Soll er die Werte aus dem XML ausgeben, oder soll er dir das XML als solches (sprich die Elemente, Attribute und Text) ausgeben? [1]

      -> Nein, ich erwarte an dieser Stelle eine Ausgabe der Werte aus dem XML. Sprich, wenn dem XML-Element <blubb> der wert 123 zugewiesen wurde, dann soll an dieser Stelle "123" stehen. Um auf deine zweite Frage gleich miteinzugehen:
      In meiner Abteilung kennt sich niemand mit XML aus, inklusive mir bis vor 2 Wochen. Die haben dort ein in XML geschriebenes Fehlerausgabeprogramm. Heisst: Jemand meldet nen Bug und das Programm weist in XML dann den jeweiligen Elementen Werte zu, wie z.B. Bug ID, Sachbearbeiter, Erstelldatum, Datum der letzten Änderung, Kurzbeschreibung... so Dinge. Diese Daten rufen wir bis jetzt aus ner reinen *.xml-Datei ab. Sieht dann quasi folgendermaßen aus

      <bug_id>319</bug_id>
      <creation_ts>16:38:54</creation_ts>
      ...
      ...
      ...
      ...

      Jetzt sollte ich jedoch durch XSL eine optisch ansprechendere Ausgabe schreiben.

      Grobes Beispiel:

      ID des derzeitigen Bugs: 319 .:. - .:. Datum der letzten Änderung ...

      Kurzbeschreibung: ........

      zusätzliche Informationen

      Priorität:
      etc.
      etc.
      etc...

      Also durch XSL und CSS ne Websitelayout erstellen, in der nicht nur die reinen Daten angegeben werden, sondern z.B. noch kleine extra Funktionen etc verschachtelt sind.

      Mein Problem in diesem Falle ist jetzt, dass ich nicht weiss, wie ich mir die Werte der XML in den div-Containern anzeigen lassen kann, da es ja, wie du erklärt hast, nicht innerhalb eines xsl:templates kein zweites xsl:template geben kann. Alles in allem brauch ich nur eine Ausgabe der Daten an den entsprechenden Punkten im Code.

      z.B.

      <!-- Div Container Header -->

      <div id="conhead"> aktuelle bug id - *XML-Wert für <bug_id>* </div>

      Ich hoffe meine Erklärung, hat dir geholfen, dass Problem besser zu verstehen. Ich bedanke mich schonmal im Vorraus.
      Liebe Grüße

      1. Hallo,

        erstmal danke für die Antwort. Ich werde mal versuchen, dir das Problem genauer zu erläutern.

        Ws erwartet du an der Stelle _genau_? Soll er die Werte aus dem XML ausgeben, oder soll er dir das XML als solches (sprich die Elemente, Attribute und Text) ausgeben? [1]

        -> Nein, ich erwarte an dieser Stelle eine Ausgabe der Werte aus dem XML. Sprich, wenn dem XML-Element <blubb> der wert 123 zugewiesen wurde, dann soll an dieser Stelle "123" stehen. Um auf deine zweite Frage gleich miteinzugehen:
        In meiner Abteilung kennt sich niemand mit XML aus, inklusive mir bis vor 2 Wochen.

        Dann hast du jetzt die gute Chance der lokale XML-Guru zu werden :)

        <bug_id>319</bug_id>
        <creation_ts>16:38:54</creation_ts>

        Mein Problem in diesem Falle ist jetzt, dass ich nicht weiss, wie ich mir die Werte der XML in den div-Containern anzeigen lassen kann, da es ja, wie du erklärt hast, nicht innerhalb eines xsl:templates kein zweites xsl:template geben kann. Alles in allem brauch ich nur eine Ausgabe der Daten an den entsprechenden Punkten im Code.

        Ich hoffe meine Erklärung, hat dir geholfen, dass Problem besser zu verstehen. Ich bedanke mich schonmal im Vorraus.

        Ja. die hat geholfen.
        Du hast grundsätzlich zwei Möglichkeiten
        Wenn das XML z.B. so ist:

        <irgendeinelement>
          <bug_id>319</bug_id>
          <creation_ts>16:38:54</creation_ts>
           ...
        </irgendeinelement>
        <irgendeinelement>
          <bug_id>xxx</bug_id>
          <creation_ts>16:38:54</creation_ts>
           ...
        </irgendeinelement>

        -----------------
          <xsl:template match="/">
            <html>
              <head>
                <title>bugZilla Fehleranalyse</title>
                <link rel="stylesheet" href="basic.css" type="text/css" media="screen, projection"/>
              </head>
              <body>
                <div id="container">
                  <div id="header">
                    <h1>.:. bugZilla fehleranalyse .:.</h1>
                  </div>
                  <div id="conlinks">Content Links</div>
                  <div id="conrechts">Content Rechts</div>
                  <div id="conmain">
                   <!-- Content Main -->

        <xsl:for-each select="irgendeinelement">
               <h2><xsl:value-of select="bug_id" /></h2>
               <div>
                  <xsl:value-of select="creation_ts" />
               <div>
                  usw. wie es du halt für die ausgabe brauchst
           </xsl:for-each>

        <!-- End Content Main -->
                  </div>
                </div>
                </body>
            </html>
          </xsl:template>

        Wenn aber das XML nur so aussieht:

        <bug_id>xxx</bug_id>
          <creation_ts>16:38:54</creation_ts>
          ...

        <bug_id>xxx</bug_id>
          <creation_ts>16:38:54</creation_ts>
          ....

        <bug_id>xxx</bug_id>
          <creation_ts>16:38:54</creation_ts>
          ...

        Hast du nur eine Möglichkeit:
        Du mast für jedes Element das du Ausgeben willst ein eigenes Template:
        <xsl:template match="bug_id">
          <h2><xsl:value-of select="." /></h2>
        </xsl:template>

        <xsl:template match="creation_ts">
           <div>
              <xsl:value-of select="." />
           <div>
        </xsl:template>

        usw.

        Dann sagst du in deinem Haupttemplate:
          <xsl:template match="/">
            <html>
              <head>
                <title>bugZilla Fehleranalyse</title>
                <link rel="stylesheet" href="basic.css" type="text/css" media="screen, projection"/>
              </head>
              <body>
                <div id="container">
                  <!-- Container header-->
                  <!-- Anfang header-->
                  <div id="header">
                    <h1>.:. bugZilla fehleranalyse .:.</h1>
                  </div>
                  <div id="conlinks">Content Links</div>
                  <div id="conrechts">Content Rechts</div>
                  <div id="conmain">
                    <!-- Content Main -->

        <xsl:apply-templates />

        <!-- End Content Main -->
                  </div>
                </div>
                </body>
            </html>
          </xsl:template>

        Für Elemente die du nicht ausgeben willst kannst oder musst du dann ein leeres Template erstellen:

        <xsl:template match="element1 | element2 | usw." />

        Das mal grundsätzlich.
        Natürlich gibt es noch andere Möglichkeiten, wo du entlang der verschiedenen XPath-Achen navigieren und Elemente/Attribute auswählen kannst, nur ich denke mir, dass das im Moment vielleicht zu kompliziert wäre (und ich kenne weder die genaue XML-Struktur, noch die genau gewünschte Ausgabe)

        Grüße
        Thomas

        1. Hallo,

          erstmal tausend Dank Thomas für deine schnelle und verständliche Hilfe. Ich werde morgen auf der Arbeit das erstmal ausprobieren, aber bin sehr zuversichtlich, dass ich das durch deine Anleitungen hinbekommen werde. Falls sich weitere Komplikationen einstellen sollten werde ich das in diesen Thread reinposten und drauf hoffen, dass du Zeit und Lust findest eventuell noch ein Wörtchen dazuzuschreiben ;-) nochmals Vielen Dank und eine schöne Woche wünsche ich dir! Gute Nacht und Gruß