Galileo Computing < openbook >
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung

...powered by haas.homelinux.net...

Einstieg in VB.NET von René Martin
- Für Programmiereinsteiger -
Einstieg in VB.NET
gp Kapitel 10 XML-Dokumente
  gp 10.1 XML-Grundlagen
  gp 10.2 XML, HTML und XSL – die Ausgabe
    gp 10.2.1 XSL
    gp 10.2.2 Der Aufbau einer XSL-Datei
    gp 10.2.3 Mehrere Kindelemente anzeigen
    gp 10.2.4 Alle Elemente einer Ebene anzeigen
    gp 10.2.5 Attribute auslesen
    gp 10.2.6 STYLE in SPAN und DIV
    gp 10.2.7 Tabellen
    gp 10.2.8 Daten sortieren
    gp 10.2.9 Daten filtern
    gp 10.2.10 Ebenen durchlaufen
    gp 10.2.11 Entscheidungen
    gp 10.2.12 Bilder
    gp 10.2.13 Hyperlinks
    gp 10.2.14 Zusammenfassung von XSL
  gp 10.3 Mit VB.NET nach XML und zurück
    gp 10.3.1 Das DOM
    gp 10.3.2 Ein neues XML-Dokument erzeugen
    gp 10.3.3 Neue Elemente erzeugen
    gp 10.3.4 XML-Dokumente auslesen
    gp 10.3.5 Zugriff auf Attribute
    gp 10.3.6 Durchlaufen von mehreren Ebenen
    gp 10.3.7 Weitere XML-Elemente in VB.NET
    gp 10.3.8 Erzeugen von XML-Objekten und Eigenschaften
    gp 10.3.9 Löschen von Elementen im XML-Dokument
    gp 10.3.10 Transformationen von XML mit dem DOM
    gp 10.3.11 Zusammenfassung VB.NET und XML
  gp 10.4 Ein Beispiel
    gp 10.4.1 Das TreeView-Steuerelement
    gp 10.4.2 Daten werden eingelesen
    gp 10.4.3 Export in eine XML-Datei
  gp 10.5 Zusammenfassung


Galileo Computing

10.2 XML, HTML und XSL – die Ausgabe  downtop

Nachdem eine wohlgeformte oder eine gültige XML-Datei erstellt worden ist, stellt sich die Frage, was mit ihr geschieht. Die Anzeige im Internet Explorer ist zur reinen Informationsvermittlung okay, allerdings wenig brauchbar, da die Benutzer von Browsern anderes gewöhnt sind. Die Daten sollen auf vernünftige, das heißt ansehnliche Weise, veröffentlicht werden. Und genau hier greift HTML.

Eine einfache Möglichkeit, XML-Dokumente anzuzeigen, sind Style Sheets.

So wie Dokumente in Textverarbeitungsprogrammen nicht »hart«, sondern mit Formatvorlagen formatiert werden sollten, stellen viele Browser die Möglichkeit zur Verfügung, mit CSS (Cascading Style Sheets) zu arbeiten. Diese Technik wurde vom World Wide Web Consortium 1996 entwickelt und im Netscape 4.0 und Internet Explorer 4.0 vollständig implementiert.

Der dahinter liegende Grundgedanke ist die Trennung von Information und Gestaltung. CSS ist lediglich für das Aussehen eines Dokuments zuständig; in ihm sind keinerlei Informationen über die Struktur des Dokuments verzeichnet. Verzichtet man auf CSS, kann ein aufgeblähter und unübersichtlicher Code entstehen. Mit CSS können kürzere Ladezeiten erreicht werden. Und schließlich ist die Pflege der Formate leichter, wenn CSS verwendet wird.

Ein CSS-Dokument ist eine Datei, in der die Stile für andere HTML-Seiten festgelegt werden. In diesem Kapitel wird darauf allerdings nicht eingegangen – es würde den Rahmen sprengen. Über CSS gibt es inzwischen schon eine ganze Menge Literatur.


Galileo Computing

10.2.1 XSL  downtop

Eine weitere und viel elegantere Möglichkeit, die Daten auszugeben und zu formatieren, besteht über XSL (Extensible Stylesheet Language). Während XML die Daten hält und strukturiert, gibt XSL sie aus. Genauer gesagt besteht XSL sogar aus zwei Teilen; der eine transformiert die Daten, der andere formatiert sie. Beide Teile können unabhängig voneinander agieren, machen in der Regel aber erst im Zusammenspiel Sinn. Die Transformationssprache wird häufig XSLT genannt.


Galileo Computing

10.2.2 Der Aufbau einer XSL-Datei  downtop

Sehen wir uns ein Beispiel an. Eine XSL-Datei hat folgende Gestalt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
   <xsl:template>
      <H1>
         <xsl:value-of select="Artikel/Buch/Nummer"/>
      </H1>
      <p>
         <xsl:value-of select="Artikel/Buch/Titel"/>
         <xsl:value-of select="Artikel/Buch/Gruppe"/>
      </p>
   </xsl:template>
</xsl:stylesheet>

Sie wird durch das Tag <xsl:stylesheet> eingeleitet. Als Attribut wird der Namensraum definiert (xmlns:xsl=»http://www.w3.org/TR/WD-xsl«). Dieses Tag findet am Ende des Dokuments seine Entsprechung. Das nächste Tag <xsl:template> definiert den Namensraum. Nach dem Doppelpunkt folgt das Schlüsselwort template. Auch dieses Tag findet seine Entsprechung am Ende. Das folgende Tag <H1> ist nun die erste Formatierung (»Heading1«), in welcher sich das Element »Nummer« befindet, oder genauer »Artikel/Buch/Nummer«. »Artikel« ist das Wurzelelement und hat selbst keine Inhalte, kann deshalb auch nicht formatiert werden. Das Attribut value-of liest den Inhalt aus.

Das zweite Tag <p> formatiert die übrigen zwei Elemente und stellt sie im Browser dar.

Diese XSL-Datei muss nun noch in die XML-Datei eingebunden werden. Dies geschieht mit dem Befehl:

<?xml-stylesheet href="XSLFormate10.xsl" type="text/xsl"?> 

Auch hier steht diese Zeile direkt nach

<?xml version="1.0" encoding="ISO-8859-1"?>

Wie man an diesem Beispiel sehen kann, wird die XSL-Datei mit der Endung »xsl« gespeichert. Man kann sich diese Datei übrigens auch im Browser anzeigen lassen – die Anzeige entspricht einem XML-Dokument ohne Formatierung.

Abbildung

Abbildung 10.10   Das XML-Dokument wird mit einer XSL-Datei formatiert.

Neben dem Kindelement »xsl:template« stehen noch weitere Elemente zur Verfügung. Auf sie soll nicht weiter eingegangen werden. Hier die vollständige Liste:

Tabelle 10.5   Die Kindelemente von <xsl:stylesheet>
Element Beschreibung
xsl:import ein XSLT-Stylesheet wird importiert
xsl:include ein XSLT-Stylesheet wird eingebunden
xsl:strip-space tauchen mehrere Leerzeichen im Dokument auf, so werden sie entfernt
xsl:preserve-space tauchen mehrere Leerzeichen im Dokument auf, so bleiben sie erhalten
xsl:output damit kann ein XML-Dokument in ein anderes XML-, ein HTML-Dokument oder eine Textdatei verwandelt werden
xsl:key Schlüssel
xsl:decimal-format bestimmt das Aussehen von reellen Zahlen
xsl:namespace-alias das Namensraumpräfix wird durch ein anderes Präfix ersetzt
xsl:attribute-set Attribute können erzeugt werden
xsl-variable eine Variable wird deklariert
xsl:param eine globale Variable wird deklariert
xls:template damit wird der Knoten bereitgestellt, mit dem das XSLT-Dokument bearbeitet wird


Galileo Computing

10.2.3 Mehrere Kindelemente anzeigen  downtop

Wenn nun allerdings mehrere Elemente in dem XML-Dokument stehen, so muss die XSL-Datei modifiziert werden. Vom Dokument

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate11.xsl" type="text/xsl"?>
<Artikel>
   <Buch>
      <Nummer>117</Nummer>
      <Titel>Biologisch kochen und backen</Titel>
      <Gruppe>Kochbuch</Gruppe>
      <Preis>14,90</Preis>
   </Buch>
   <Buch>
      <Nummer>118</Nummer>
      <Titel>Meine Rezepte</Titel>
      <Gruppe>Kochbuch</Gruppe>
      <Preis>44,90</Preis>
   </Buch>
   <Buch>
      <Nummer>119</Nummer>
      <Titel>Original italienische Pasta</Titel>
      <Gruppe>Kochbuch</Gruppe>
      <Preis>38,80</Preis>
   </Buch>
</Artikel>

wird unverändert nur das erste Element angezeigt. Damit alle Einträge zu sehen sind, muss das XSL-Dokument mit for-each modifiziert werden:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
   <H1>
      <xsl:value-of select="Nummer"/>
   </H1>
   <p>
      <xsl:value-of select="Titel"/>
      <xsl:value-of select="Gruppe"/>
   </p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Zwei Änderungen wurden vorgenommen. Zum einen wurde ein for-each-Tag eingeführt, der alle Elemente von <Artikel/Buch> durchläuft. Nun muss mit dem select-Attribut nicht mehr der gesamte Pfad angegeben werden, sondern nun genügt der Name des Elements. Da sich die drei Elemente »Nummer«, »Titel« und »Buch« auf der gleichen Ebene befinden, können sie problemlos in die for-each-Schleife eingebunden werden.

Abbildung

Abbildung 10.11   Mehrere Elemente werden angezeigt.

Selbstverständlich müssen nicht alle Elemente angezeigt werden. Man könnte XSL auch zur Selektion von Daten heranziehen. Im folgenden Beispiel werden lediglich die Titel angezeigt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
   <xsl:for-each select="Artikel/Buch">
      <p>
         <xsl:value-of select="Titel"/>
      </p>
   </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Abbildung

Abbildung 10.12   Es kann auch nur ein Teil angezeigt werden.

Dabei können die wichtigsten HTML-Tags verwendet werden <H1>, <H2>, .. <H6>, <P>, <B>, <I>, <U>, <BIG>, <STRONG>, <SUB>, <SUP>, <SPAN>, <DIV>, <STYLE> und noch einige weitere.

Und damit werden auch die Vorteile der Verwendung von XML und XSL deutlich. Es geht nicht nur um den Import und Export von Daten, sondern sie sollen zugleich auf eine bestimmte Art angezeigt werden. Gerade bei Änderungen wirkt sich die Trennung in Gestaltung und Daten positiv aus. Die Daten können einfach verändert oder neu eingelesen werden, die Formatierung kann leicht geändert werden. Ebenso kann ein Element schnell von einer Formatierungsebene auf eine andere geschoben werden.


Galileo Computing

10.2.4 Alle Elemente einer Ebene anzeigen  downtop

Sollen alle Elemente angezeigt werden, ganz gleich, wie sie heißen, dann kann die Selektion mit folgendem Operator durchgeführt werden:

      <xsl:value-of select="."/>

Galileo Computing

10.2.5 Attribute auslesen  downtop

Befinden sich Werte in Attributen, so können auch diese ausgelesen werden. Im folgenden Dokument besitzt das Element <Buch> das Attribut »Preis«:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate14.xsl" type="text/xsl"?>
<Artikel>
   <Buch Preis="14,90">
      <Nummer>117</Nummer>
      <Titel>Biologisch kochen und backen</Titel>
      <Gruppe>Kochbuch</Gruppe>
   </Buch>
   <Buch Preis="44,90">
      <Nummer>118</Nummer>
      <Titel>Meine Rezepte</Titel>
      <Gruppe>Kochbuch</Gruppe>
   </Buch>
   <Buch Preis="38,80">
      <Nummer>119</Nummer>
      <Titel>Original italienische Pasta</Titel>
      <Gruppe>Kochbuch</Gruppe>
   </Buch>
</Artikel>

Das zugehörige XSL-Dokument liest alle Elemente der Kindknoten »Buch« und sein Attribut »Preis« aus:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
   <H1>
      <xsl:value-of select="Nummer"/>
   </H1>
   <p>
      <xsl:value-of select="."/>
      <xsl:value-of select="@Preis"/>
   </p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Beachten Sie, dass sich vor dem Attributnamen ein »@« befindet. Und beachten Sie, dass die Zeile

      <xsl:value-of select="."/>

alle Elemente der Ebene »Artikel/Buch« herausholt.

Abbildung

Abbildung 10.13   Auch Attribute können ausgelesen werden.


Galileo Computing

10.2.6 STYLE in SPAN und DIV  downtop

Noch flexibler gestaltet sich die Ausgabe, wenn zu den Tags das STYLE-Attribut verwendet wird. Insbesondere die beiden Tags <DIV> und <SPAN> eignen sich dafür, da sie nicht vorbelegt sind, sondern als Attribute die einzelnen Gestaltungsmerkmale erhalten. Sie wurden mit HTML 4.0 eingeführt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<DIV STYLE="color:red; font-family:Arial; font-size:24pt; font-weight:bold">
<xsl:value-of select="Nummer"/>
</DIV>
<DIV STYLE="color:black; font-family:Times; font-size:12pt">
<xsl:value-of select="Titel"/>
<xsl:value-of select="Gruppe"/>
</DIV>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Die beiden ursprünglichen Tags <H1> und <p> wurden ersetzt durch <DIV>. Als Attribut STYLE erhält er die Schriftmerkmale zugewiesen. Da sich <Titel> und <Gruppe> innerhalb eines <DIV>-Tags befinden, werden sie hintereinander geschrieben. Wollte man dies verhindern, so müsste man nach <Titel> </DIV> enden lassen:

<DIV STYLE="color:black; font-family:Times; font-size:12pt">
   <xsl:value-of select="Titel"/>
</DIV>
<DIV STYLE="color:black; font-family:Times; font-size:12pt">
   <xsl:value-of select="Gruppe"/>
</DIV>
Abbildung

Abbildung 10.14   Unterschiedliche Gestaltungen mit XSL

Das Tag <DIV> erzeugt einen automatischen Zeilenumbruch, der hier gewünscht wird. Soll er vermieden werden, so kann statt <DIV> das Tag <SPAN> verwendet werden; dort findet kein Umbruch statt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
   <SPAN STYLE="color:red; font-family:Arial; font-size:24pt; font-weight:bold">
      <xsl:value-of select="Nummer"/>
   </SPAN>
   <SPAN STYLE="color:black; font-family:Times; font-size:12pt">
      <xsl:value-of select="Titel"/>
   </SPAN>
   <SPAN STYLE="color:black; font-family:Times; font-size:12pt">
      <xsl:value-of select="Gruppe"/>
   </SPAN>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Abbildung

Abbildung 10.15   Das gleiche Dokument mit dem Tag <SPAN> statt <DIV>

Normalerweise wird <DIV> für eine Absatzgestaltung verwendet, <SPAN> innerhalb eines Fließtexts für Zeichenformatierung. Will man einen bestimmten Abstand zwischen den einzelnen Absätzen definieren, so kann der Abstand festgelegt werden:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
   <DIV STYLE="position:relative; left:75px; top:50px; width:600px; color:red; 
font-family:Arial; font-size:24pt; font-weight:bold">
      <xsl:value-of select="Nummer"/>
   </DIV>
   <DIV STYLE="position:relative; left:100px; top:50px; width:600px; color:black; 
   font-family:Times; font-size:12pt">
      <xsl:value-of select="Titel"/>
   </DIV>
   <DIV STYLE="position:relative; left:100px; top:50px; width:600px; color:black; 
   font-family:Times; font-size:12pt">
      <xsl:value-of select="Gruppe"/>
   </DIV>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Abbildung

Abbildung 10.16   Der Text mit Einrückungen


Galileo Computing

10.2.7 Tabellen  downtop

Um längere Texte soll es in diesem Buch nicht gehen. Vielmehr stehen Daten im Vordergrund, die ordentlich dargestellt werden sollen. Und dafür stellt HTML bekanntlich Tabellen zur Verfügung:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<STYLE>
   <![CDATA[
      .Tabellenkopf
         {
            align:center;
            color:red; 
            font-family:Arial; 
            font-size:24pt; 
            font-weight:bold
         }
      .Tabellengestaltung
         {
            color:black;
            font-family:Times; 
            font-size:12pt
          }
      ]]>
</STYLE>
<TABLE BORDER="5" WIDTH="100  %">
   <TR ALIGN="center">
      <TD WIDTH="25  %">
         <DIV CLASS="Tabellenkopf">
            Nummer
         </DIV>
      </TD>
      <TD WIDTH="50  %">
         <DIV CLASS="Tabellenkopf">
            Titel
         </DIV>
      </TD>
      <TD WIDTH="25  %">
         <DIV CLASS="Tabellenkopf">
            Gruppe
         </DIV>
      </TD>
   </TR>
   <xsl:for-each select="Artikel/Buch">
   <TR>
      <TD>
         <DIV CLASS="Tabellengestaltung">
            <xsl:value-of select="Nummer"/>
         </DIV>
      </TD>
      <TD>
         <DIV CLASS="Tabellengestaltung">
            <xsl:value-of select="Titel"/>
         </DIV>
      </TD>
      <TD>
         <DIV CLASS="Tabellengestaltung">
            <xsl:value-of select="Gruppe"/>
         </DIV>
      </TD>
   </TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>

In diesem langen Beispiel stecken nun einige Informationen. Verwendet wurden einige typische HTML-Formate, wie

<TABLE BORDER="5" WIDTH="100  %">
   <TR ALIGN="center">
      <TD WIDTH="25  %">

um die Breite der Tabelle (100  % der Browserbreite), die Ausrichtung des Kopfs (zentriert) und die Breite der ersten Spalte (25  %) festzulegen. Die zentrierte Ausrichtung ist dabei überflüssig – sie wird bereits im Style »Tabellenkopf« festgelegt:

      .Tabellenkopf
         {
            align:center;
            color:red; 
            font-family:Arial; 
            font-size:24pt; 
            font-weight:bold
         }

Dieser Stil wird nun für den Kopf verwendet, ein zweiter für die eigentlichen Daten. Alle Elemente des Tags Artikel/Buch werden durchlaufen:

   <xsl:for-each select="Artikel/Buch">

Danach wird eine Zeile erzeugt (<TR>), in der Zeile wird die Formatierung verwendet und das Element herausgeholt:

      <TD>
         <DIV CLASS="Tabellengestaltung">
            <xsl:value-of select="Nummer"/>
Abbildung

Abbildung 10.17   Die Ausgabe als Tabelle


Galileo Computing

10.2.8 Daten sortieren  downtop

Doch XSL hat noch weitere angenehme Eigenschaften. Man kann mit seiner Hilfe die Daten sortieren lassen. Läuft eine Schleife durch alle Datensätze, dann kann man im for-each-Tag bereits festlegen, nach welchem Kriterium die Daten sortiert werden:

   <xsl:for-each select="Artikel/Buch" order-by="+ Titel">

Mit Hilfe des Attributs »order-by« wird in Anführungszeichen die Sortierreihenfolge (+ oder -) festgelegt, also aufsteigende oder absteigende Reihenfolge. Danach folgt der Elementname, nach dem sortiert werden soll.


Galileo Computing

10.2.9 Daten filtern  downtop

Man kann auch Daten filtern. Leider kann man nicht direkt über ein Kriterium auf den Inhalt eines Elements zugreifen. Aber man kann über Attribute Daten filtern. Angenommen, das obige Beispiel wird ein wenig modifiziert und sieht nun folgendermaßen aus:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate22.xsl" type="text/xsl"?>
<Artikel>
   <Buch Nummer="117">
      <Titel>Biologisch kochen und backen</Titel>
      <Gruppe>Kochbuch</Gruppe>
      <Preis>14,90</Preis>
   </Buch>
   <Buch Nummer="118">
      <Titel>Meine Rezepte</Titel>
      <Gruppe>Kochbuch</Gruppe>
      <Preis>44,90</Preis>
   </Buch>
   <Buch Nummer="119">
      <Titel>Italienische Pasta</Titel>
      <Gruppe>Kochbuch</Gruppe>
      <Preis>38,80</Preis>
   </Buch>
</Artikel>

Die Nummern sind nun Attribute der Buch-Tags. Nun kann man ein Buch oder mehrere Bücher herausfiltern:

...
   <xsl:for-each select="Artikel/Buch" order-by="+ Titel">
      <xsl:choose>
         <xsl:when match="Buch[@Nummer > '117']">
            <TR>
               <TD>
                  <DIV CLASS="Tabellengestaltung">
                     <xsl:value-of select="@Nummer"/>
                  </DIV>
              </TD>
              <TD>
                 <DIV CLASS="Tabellengestaltung">
                    <xsl:value-of select="Titel"/>
                 </DIV>
             </TD>
             <TD>
                <DIV CLASS="Tabellengestaltung">
                   <xsl:value-of select="Gruppe"/>
                </DIV>
            </TD>
         </TR>
      </xsl:when>
   </xsl:choose>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>

Es fällt das Tag <xsl:when match="Buch[@Nummer = '117']"> auf. In ihm wird das Element angegeben und in eckiger Klammer, getrennt durch einen Klammeraffen, der Name des Attributs. Ein Tag könnte ja mehrere Attribute besitzen. Hinter dem Gleichheitszeichen steht nun der Wert, der gefiltert werden soll. Da match selbst eine Zeichenketten verlangt, die in Anführungszeichen geschrieben ist, muss der Wert (hier 117) in einfache Hochkommata gesetzt werden. Man könnte ebenso die bekannten Vergleichsoperatoren verwenden:

<xsl:when match="Buch[@Nummer > '117']">

Dass die beiden Tags

   <xsl:choose>
      <xsl:when match="Buch[@Nummer > '117']">

beendet werden müssen, ist klar. Sie finden die Schlusstags in:

      </xsl:when>
   </xsl:choose>

Analog zu WENN-Funktionen in Excel oder IF-Verzweigungen in VBA gibt es auch hier einen Sonst-Zweig. Er wird mit <xsl:otherwise> eingeleitet und natürlich mit </xsl:otherwise> beendet. Damit könnte man beispielsweise – in Abhängigkeit von einem Kriterium – eine bestimmte Formatierung einschalten.

Abbildung

Abbildung 10.18   Die Daten werden gefiltert und sortiert.

Jedoch Achtung: Da das Attribut im obigen Beispiel keine echte Zahl ist, werden die Attribute wie Zeichenketten verglichen. Das heißt, dass ein Wert <Buch Nummer="99"> ebenso das Kriterium <xsl:when match="Buch[@Nummer = '117']"> erfüllt, da lediglich die Zeichen von links nach rechts gelesen werden.

Und da 9 > 1, folgt 99 > 117. Dieses Problem, das übrigens auch bei der Sortierung auftritt, könnte einfach umgangen werden, indem die Stellen vor der ersten Ziffer »aufgefüllt« werden, zum Beispiel so:

<Buch Nummer="099">

Galileo Computing

10.2.10 Ebenen durchlaufen  downtop

Stehen im Zentrum die Daten, dann kann ein Feld dargestellt werden über:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
   <xsl:template>
      <xsl:for-each select="Artikel/Buch">
         <p>
            <xsl:value-of select="Titel"/>
         </p>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

Sollen dagegen alle Elemente von »Artikel/Buch« angezeigt werden, so kann das select-Kriterium modifiziert werden:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
   <xsl:template>
      <xsl:for-each select="Artikel/Buch">
         <p>
            <xsl:value-of select="."/>
         </p>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

Auch der umgekehrte Fall ist möglich. Werden beispielsweise die Bücher gesucht, ist aber nicht klar, auf welcher Ebene das Element »Buch« steht (möglicherweise sogar auf unterschiedlichen Ebenen), dann kann das Suchkriterium mit zwei Schrägstrichen geschrieben werden als:

<xsl:for-each select="Artikel//Buch">

Dadurch werden alle Ebenen durchsucht, bis ein Element <Buch> gefunden wurde. Seine Inhalte können dann mit

      <xsl:value-of select="."/>

angezeigt werden.

Abbildung

Abbildung 10.19   Alle Daten <xsl:value-of select=«.»/>


Galileo Computing

10.2.11 Entscheidungen  downtop

An einem größeren Beispiel soll gezeigt werden, wie in XML gehaltene Daten durch XSL strukturiert ausgegeben werden. Gegeben sei ein (beliebig) großes Dokument, in dem sich Bücher aus verschiedenen Kategorien befinden:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate21.xsl" type="text/xsl"?>
<Artikel>
   <Buch Kategorie="Roman">
      <Titel>Alle träumten von Cuba</Titel>
      <Autor>Miguel Barnet</Autor>
      <Jahr>1981</Jahr>
   </Buch>
   <Buch Kategorie="Roman">
      <Titel>Ansichten der Tropen im Morgengrauen</Titel>
      <Autor>Guillermo Cabrera Infante</Autor>
      <Jahr>1992</Jahr>
   </Buch>
   <Buch Kategorie="Roman">
      <Titel>Drei traurige Tiger</Titel>
      <Autor>Guillermo Cabrera Infante</Autor>
      <Jahr>1987</Jahr>
   </Buch>
   <Buch Kategorie="Roman">
      <Titel>kolibri</Titel>
      <Autor>Severo Sarduy</Autor>
      <Jahr>1991</Jahr>
   </Buch>
   <Buch Kategorie="Roman">
      <Titel>Woher die Sänger sind</Titel>
      <Autor>Severo Sarduy</Autor>
      <Jahr>1993</Jahr>
   </Buch>
   <Buch Kategorie="Autobiografie">
      <Titel>Bevor es Nacht wird</Titel>
      <Autor>Reinaldo Arenas</Autor>
      <Jahr>1993</Jahr>
   </Buch>
   <Buch Kategorie="Roman">
      <Titel>Rosa</Titel>
      <Autor>Reinaldo Arenas</Autor>
      <Jahr>1984</Jahr>
   </Buch>
   <Buch Kategorie="Roman">
      <Titel>Reise nach Havanna</Titel>
      <Autor>Reinaldo Arenas</Autor>
      <Jahr>1994</Jahr>
   </Buch>
   <Buch Kategorie="Gedichte">
      <Titel>Die Plantage</Titel>
      <Autor>Reinaldo Arenas</Autor>
      <Jahr>1981</Jahr>
   </Buch>
</Artikel>

In einer Tabelle sollen nun – so die Vorgabe – zuerst die Gedichte, dann die Romane und am Ende die Autobiografien angezeigt werden. Die XSL-Datei »XSLFormate21.xsl« sieht wie folgt aus:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<STYLE>
   <![CDATA[
      .Tabellenkopf
         {
            align:center;
            color:red; 
            font-family:Arial; 
            font-size:24pt; 
            font-weight:bold
         }
      .Tabellengestaltung
         {
            color:black;
            font-family:Times; 
            font-size:12pt
          }
      ]]>
</STYLE>
<TABLE BORDER="5" WIDTH="100  %">
   <TR ALIGN="center">
      <TD WIDTH="20  %">
         <DIV CLASS="Tabellenkopf">
            Autor
         </DIV>
      </TD>
      <TD WIDTH="50  %">
         <DIV CLASS="Tabellenkopf">
            Titel
         </DIV>
      </TD>
      <TD WIDTH="10  %">
         <DIV CLASS="Tabellenkopf">
            Jahr
         </DIV>
      </TD>
      <TD WIDTH="20  %">
         <DIV CLASS="Tabellenkopf">
            Kategorie
         </DIV>
      </TD>
   </TR>
   <xsl:for-each select="Artikel/Buch" order-by="+ Autor">
      <xsl:choose>
         <xsl:when match="Buch[@Kategorie = 'Gedichte']">
            <TR>
               <TD>
                  <DIV CLASS="Tabellengestaltung">
                     <xsl:value-of select="Autor"/>
                  </DIV>
              </TD>
              <TD>
                 <DIV CLASS="Tabellengestaltung">
                    <xsl:value-of select="Titel"/>
                 </DIV>
             </TD>
             <TD>
                <DIV CLASS="Tabellengestaltung">
                   <xsl:value-of select="Jahr"/>
                </DIV>
            </TD>
             <TD>
                <DIV CLASS="Tabellengestaltung">
                   <xsl:value-of select="@Kategorie"/>
                </DIV>
            </TD>
         </TR>
      </xsl:when>
   </xsl:choose>
   </xsl:for-each>
   <xsl:for-each select="Artikel/Buch" order-by="+ Autor">
      <xsl:choose>
         <xsl:when match="Buch[@Kategorie = 'Roman']">
            <TR>
               <TD>
                  <DIV CLASS="Tabellengestaltung">
                     <xsl:value-of select="Autor"/>
                  </DIV>
              </TD>
              <TD>
                 <DIV CLASS="Tabellengestaltung">
                    <xsl:value-of select="Titel"/>
                 </DIV>
             </TD>
             <TD>
                <DIV CLASS="Tabellengestaltung">
                   <xsl:value-of select="Jahr"/>
                </DIV>
            </TD>
             <TD>
                <DIV CLASS="Tabellengestaltung">
                   <xsl:value-of select="@Kategorie"/>
                </DIV>
            </TD>
         </TR>
      </xsl:when>
   </xsl:choose>
</xsl:for-each>
   <xsl:for-each select="Artikel/Buch" order-by="+ Autor">
      <xsl:choose>
         <xsl:when match="Buch[@Kategorie = 'Autobiografie']">
            <TR>
               <TD>
                  <DIV CLASS="Tabellengestaltung">
                     <xsl:value-of select="Autor"/>
                  </DIV>
              </TD>
              <TD>
                 <DIV CLASS="Tabellengestaltung">
                    <xsl:value-of select="Titel"/>
                 </DIV>
             </TD>
             <TD>
                <DIV CLASS="Tabellengestaltung">
                   <xsl:value-of select="Jahr"/>
                </DIV>
            </TD>
             <TD>
                <DIV CLASS="Tabellengestaltung">
                   <xsl:value-of select="@Kategorie"/>
                </DIV>
            </TD>
         </TR>
      </xsl:when>
   </xsl:choose>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
Abbildung

Abbildung 10.20   Die gefilterten und sortierten Daten

Im oberen CDATA-Abschnitt befinden sich die beiden STYLE-Attribute, mit denen das Dokument gestaltet wird. Dreimal – für jede Kategorie erneut – wird die Schleife for-each bemüht. In ihr wird festgelegt, dass nach Autoren sortiert werden soll:

   <xsl:for-each select="Artikel/Buch" order-by="+ Autor">
      <xsl:choose>
         <xsl:when match="Buch[@Kategorie = 'Gedichte']">

Über das Attribut »Kategorie« wird zuerst die Kategorie »Gedichte« gefiltert, anschließend die Kategorie »Romane« und am Ende die Kategorie »Autobiografie«. Das Ergebnis stellt sich dann wie in Abbildung 10.20 dar.


Galileo Computing

10.2.12 Bilder  downtop

Ähnlich wie mit einer .css-Datei können auch mit XSL Bilder angezeigt werden. Angenommen, das Dokument hat folgende Gestalt:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate24.xsl" type="text/xsl"?>
<Liste>
   <Buch>
      <Titel>Einstieg in XML</Titel>
      <ISBN>3898421376</ISBN>
      <Seiten>450</Seiten>
      <Preis>24,90</Preis>
      <Bild>xml.jpg</Bild>
   </Buch>
   <Buch>
      <Titel>C#</Titel>
      <ISBN>389842183</ISBN>
      <Seiten>570</Seiten>
      <Preis>39,90</Preis>
      <Bild>csharpe.jpg</Bild>
   </Buch>
   <Buch>
      <Titel>VB.net Jumpstart</Titel>
      <ISBN>3898422271</ISBN>
      <Seiten>400</Seiten>
      <Preis>24,90</Preis>
      <Bild>vbnet.jpg</Bild>
   </Buch>
</Liste>

Das heißt, die Namen der Bilder befinden sich in den Tags <Bild>. Als solche können sie ausgelesen werden, falls sich die Bilder im gleichen Ordner befinden wie das XML- und das XSL-Dokument. Die zugehörige XSL-Datei »XSLFormate26.xsl« hat demnach folgende Gestalt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
   <xsl:for-each select="Liste/Buch" order-by="+ Titel">
      <DIV STYLE="color:red; font-size:24pt; font-weight:bold; font-family:Arial">
        <xsl:value-of select="Titel"/>
      </DIV>
      <IMG BORDER="0">
        <xsl:attribute name="src"><xsl:value-of select="Bild"/>
        </xsl:attribute>
      </IMG>
      <SPAN>Preis: </SPAN>
      <SPAN>
        <xsl:value-of select="Preis"/>
      </SPAN>
      <SPAN> / </SPAN>
      <SPAN>
        <xsl:value-of select="Seiten"/>
      </SPAN>
      <SPAN>Seiten</SPAN>
   </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Welche Informationen angezeigt werden und wie sie formatiert werden, spielt nun keine Rolle. Interessant ist das Element <IMG>:

      <IMG BORDER="0">
        <xsl:attribute name="src"><xsl:value-of select="Bild"/>
        </xsl:attribute>
      </IMG>


Das Tag <xsl:value-of select="Bild"/> ermittelt den Dateinamen und weist ihn dem Attribut »src« des Tags <IMG> zu. Damit wird das Bild angezeigt:

Abbildung

Abbildung 10.21   Die Bilder werden korrekt angezeigt.

Angenommen, die Bilder befinden sich in einem anderen Ordner. Soll nun der Ordner absolut angegeben werden, dann muss mit einem gemischten Element gearbeitet werden:

      <IMG BORDER="0">
         <xsl:attribute name="src">
         C:\Eigene Dateien\Bilder\Galileo\
         <xsl:value-of select="Bild"/>
         </xsl:attribute>
      </IMG>

Pfad und Dateiname werden zusammengesetzt, die Bilder werden korrekt angezeigt. Ebenso können die Dateinamen in Attributen gespeichert werden. Beispielsweise könnte das XML-Dokument so aussehen:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate24.xsl" type="text/xsl"?>
<Liste>
   <Buch>
      <Titel>Einstieg in XML</Titel>
      <ISBN>3898421376</ISBN>
      <Seiten>450</Seiten>
      <Preis>24,90</Preis>
      <Bild Quelle="xml.jpg"/>
   </Buch>
   <Buch>
      <Titel>C#</Titel>
      <ISBN>389842183</ISBN>
      <Seiten>570</Seiten>
      <Preis>39,90</Preis>
      <Bild Quelle="csharpe.jpg"/>
   </Buch>
   <Buch>
      <Titel>Einstieg in VB.NET</Titel>
      <ISBN>3898422271</ISBN>
      <Seiten>400</Seiten>
      <Preis>24,90</Preis>
      <Bild Quelle="vbnet.jpg"/>
   </Buch>
</Liste>

Das Tag <Bild> ist leer – es enthält lediglich das Attribut »Quelle« mit dem Dateinamen als Wert. Diesmal wird nicht der Inhalt eines Elements ausgelesen, sondern das Attribut. Der Pfad soll relativ zum Speicherort der XML-Datei angegeben werden; die Bilder befinden sich in einem Unterordner »Bilder«:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<STYLE>
   <![CDATA[
      .Tabellengestaltung
         {
            color:black;
            font-family:Times; 
            font-size:12pt
          }
      ]]>
</STYLE>
<SPAN STYLE="color:red; font-family:Arial; font-weight:bold; font-size:24pt">
Literaturliste</SPAN>
<TABLE BORDER="0" WIDTH="100  %">
   <xsl:for-each select="Liste/Buch" order-by="+ Titel">
      <TR>
         <TD WIDTH="10  %">
            <IMG>
               <xsl:attribute name="src">
                  <xsl:value-of select="Bild/@Quelle"/>
               </xsl:attribute>
            </IMG>
         </TD>
         <TD WIDTH="90  %">
           <DIV CLASS="Tabellengestaltung">
              <xsl:value-of select="Titel"/>
           </DIV>
           <DIV CLASS="Tabellengestaltung">
              <xsl:value-of select="ISBN"/>
           </DIV>
        </TD>
      </TR>
   </xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>

Das Tag <IMG> wurde oben bereits beschrieben. Nun holt es ein Attribut aus dem Element. Dies wird durch den Klammeraffen gekennzeichnet:

               <IMG>
               <xsl:attribute name="src">
                  <xsl:value-of select="Bild/@Quelle"/>
                </xsl:attribute>
                </IMG>

Galileo Computing

10.2.13 Hyperlinks  downtop

Nun dürfte es eigentlich kein Problem mehr sein, mit Hilfe von XSL Informationen aus Elementen oder Attributen herauszuholen und als Hyperlink darzustellen. Gegeben sei folgende abgekürzte Literaturliste:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate28.xsl" type="text/xsl"?>
<Liste>
   <Buch>
      <Titel>Einstieg in VB.NET</Titel>
      <ISBN>3898422271</ISBN>
      <Seiten>400</Seiten>
      <Preis>24,90</Preis>
      <Bild Quelle="vbnet.jpg"/>
      <Homepage xml:link="simple" href="http://www.galileocomputing.de">
	  Weitere Informationen</Homepage>
   </Buch>
...
</Liste>

Jedes Buchelement enthält einen Tag <Homepage>, welcher die Internet-Adresse des Verlags beinhaltet. Dieser wird in der Datei »XSLFormate28.xsl« ausgelesen und dargestellt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
...
<SPAN STYLE="color:red; font-family:Arial; font-weight:bold; font-size:24pt">
Literaturliste</SPAN>
<TABLE BORDER="0" WIDTH="100  %">
   <xsl:for-each select="Liste/Buch" order-by="+ Titel">
         <TR>
            <TD WIDTH="10  %">
               <IMG>
               <xsl:attribute name="src">
                  Bilder\<xsl:value-of select="Bild/@Quelle"/>
                </xsl:attribute>
                </IMG>
            </TD>
            <TD WIDTH="90  %">
              <DIV CLASS="Tabellengestaltung">
                 <xsl:value-of select="Titel"/>
              </DIV>
              <DIV CLASS="Tabellengestaltung">
                 <xsl:value-of select="ISBN"/>
              </DIV>
              <A CLASS="Tabellengestaltung">
                 <xsl:attribute name="HREF">
                    <xsl:value-of select="Homepage/@href"/>
                 </xsl:attribute>
                 <xsl:value-of select="Homepage"/>
              </A>
           </TD>
         </TR>
   </xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>

Das Ergebnis kann sich sehen lassen.

Abbildung

Abbildung 10.22   Die Hyperlinks wurden mit XSL erzeugt.


Galileo Computing

10.2.14 Zusammenfassung von XSL  toptop

In diesem Kapitel wurde beschrieben, wie eine XML-Datei dargestellt werden kann. Die wohl wichtigste Möglichkeit heißt XSL (»Extensible Stylesheet Language«). Damit können Daten flexibel aus dem XML-Dokument gefiltert und anschließend sortiert werden, Attributwerte können ausgelesen und dargestellt werden. Gleichzeitig stehen die HTML-Tags zur Formatierung, exakten Positionierung und zur Darstellung von Tabellen zur Verfügung. Eine besondere Rolle spielen die beiden Tags <SPAN> und <DIV>, da mit ihrer Hilfe Formatierungen frei vergeben werden können.

  

VB.NET

Einstieg in ASP.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML