XMLidP2000

Sitemap

Sitemap

1 Einführung
1.1 Warum mehr weniger ist
1.2 Warum mehr mehr ist
1.3 Wohin die Reise geht
2 Was sind Dokumente?
2.1 Eine kurze Geschichte der Textverarbeitung
2.2 Bestandteile eines Dokumentes
2.3 Die neue, alte Idee: Strukturorientiert schreiben
2.4 Die Entwicklung des Hypertextes
2.5 Textformate im Web
2.6 Das SGML-Konzept: Generic Markup
2.7 Dokumente versus Daten
3 XML im Web
3.1 XML bei der Verwaltung von Websites
3.2 Clientseitige XML-Interpretation
3.2.1 XML mit CSS
3.2.2 XML mit XSL(T)
3.3 XML auf dem Server
3.4 Linking-Möglichkeiten von XML
3.5 XML als Datenaustauschformat
4 XML Quick Start
4.1 Dokumenttyp-Definition (DTD) und Instanzen
4.2 Verarbeitung der Dokumente
4.2.1 Beispiel: Verarbeitung mit Cost/TCL
4.2.2 Beispiel: Verarbeitung mit XSLT
4.2.3 Beispiel: XML/XSLT im Internet Explorer
4.2.4 Fazit
5 XML-DTDs: Die verständliche Beschreibung
5.1 Ein Wort zur Notation
5.2 Dokumente
5.3 Elemente
5.4 Zeichen, Namen und Zeichendaten
5.5 Kommentare
5.6 Processing Instructions
5.7 Wo bleibt Multimedia?
5.8 Dokumenttyp-Definition (DTD)
5.8.1 Elementtyp-Deklaration
5.8.2 Attributlisten-Deklaration
5.8.3 Möglichkeiten, die DTD zu gestalten und zu gliedern
5.8.4 Notation-Deklaration
6 Namensräume in XML
7 XPath: Adressierung von XML-Dokumentteilen
7.1 Zu Grunde liegendes Datenmodell
7.2 Zugriff auf den Datenbaum
7.3 Hilfe von Operatoren
7.4 Kernfunktionen für den Datenzugriff
8 XML: Linking
8.1 Notwendige Begriffe
8.2 XLink: einfache und erweiterte Links
8.2.1 Einfache Verweise
8.2.2 Erweiterte Links
8.2.3 XLink in der Praxis
8.3 XPointer: Verweise in Dokumente hinein
8.3.1 XPath-Erweiterungen in XPointer
9 Überblick über Stylesheet-Sprachen
9.1 Cascading Style Sheets
9.1.1 Wertzuweisungen
9.1.2 Formatierungsmodell
9.1.3 CSS und XML
9.1.4 Ein Beispiel: XML im Mozilla
9.2 Document Style Semantics and Specification Language
9.2.1 Flow Objects
9.2.2 Verarbeitungs-Modus
9.2.3 DSSSL praktisch
9.2.4 Langer Marsch von DSSSL nach HTML
9.3 Extensible Stylesheet Language (XSLT und XSL)
9.3.1 Verhältnis von XSLT zu XSL
9.3.2 Formatierung mit XSL
10 XSL-Transformationen
10.1 Grundsätzliches über Templates
10.2 Ergänzungen zum Datenmodell von XPath
10.3 Struktur von XSLT-Stylesheets
10.4 Den Ergebnisbaum erzeugen
10.4.1 Diverse Basiselemente
10.4.2 Formatierte Nummerierung
10.4.3 Schleifen und bedingte Verarbeitung
10.4.4 Sortieren
10.4.5 Variable und Parameter
10.4.6 Zusätzliche Funktionen
10.4.7 XSLT-Erweiterungen
10.4.8 message, output
11 XSLT in Web-Anwendungen
11.1 XSLT im Internet Explorer
11.2 Linklisten erzeugen
11.3 Details einer Literaturgeschichte
11.3.1 Sortierte Überblicksseiten
11.3.2 Kalender: einzelne Tage ausgeben
12 XML-Editoren
12.1 Übersicht
12.1.1 Emacs + PSGML (mit XML-Unterstützung)
12.1.2 XML Notepad
12.1.3 XML Spy
12.1.4 XMetal
12.1.5 Epic
12.1.6 MarkupKit (für MS Word)
12.1.7 WordPerfect Office2000
12.2 Emacs und PSGML (mit XML-Unterstützung)
12.3 XML-Notepad
12.4 XML Spy
12.5 XMetal
12.6 Epic
12.7 MarkupKit (für MS Word)
12.8 WordPerfect Office2000
12.9 Fazit
13 Entwicklung einer DTD
13.1 Auswahl einer Mehrzweck-DTD
13.2 Entwurf einer DTD
13.2.1 Dokumentanalyse
13.2.2 Tipps und Tricks
13.3 Instanzen ohne DTD
14 Herstellung dieses Buches
14.1 Zielsetzung und Randbedingungen
14.2 Definition der DTD
14.2.1 Schritt 1: Die Grobstruktur
14.2.2 Schritt 2: Elemente auf Zeichenebene
14.2.3 Schritt 3: Die Details
14.3 Formatieren des Manuskriptes
14.3.1 Konvertierung in HTML
14.3.2 Aufbereitung für den Ausdruck
14.4 Erfahrungen mit der zweiten Auflage
15 Anwendungsbeispiel Literatur
15.1 Vorüberlegungen
15.2 En détail: die Autoren in der DTD
15.3 Wie die Daten ins Web gelangen
15.3.1 Inhaltsverzeichnis generieren
15.3.2 Ausgabe der Autorendaten
15.4 Vollständige Listings
15.4.1 DTD für die Literaturgeschichte
15.4.2 DSSSL-Listing: Inhaltsverzeichnis
15.4.3 DSSSL-Listing: Ausgabe eines einzelnen Autors
15.4.4 Perl-Code für Ausgabe einzelner Autoren
16 Verteilte Softwareverwaltung mit XML
16.1 Aufgabenbeschreibung
16.2 XML als Datenbasis
16.3 Bilden von DTD-Hierarchien
16.4 Zusammentragen von verteilten XML-Fragmenten
16.5 Fazit
16.6 Stylesheet zur Transformation in HTML
17 E-Commerce mit XML
17.1 B2B-E-Commerce
17.1.1 Die Rolle von XML
17.1.2 Technische Aspekte
17.2 BMEcat
17.3 Electronic Business XML (ebXML)
17.3.1 Arbeitsgruppen
17.3.2 Zeitplan des Projekts
17.4 XML und EDIFACT
18 XML und Apache
18.1 XML-Transformation per CGI
18.1.1 Konfiguration des Servers
18.1.2 CGI-Skript: xmlhandler.cgi
18.1.3 Beispiel: von HTML nach HTML mit DSSSL oder XSLT
18.2 Cocoon
18.2.1 Extensible Server Pages (XSP)
18.2.2 Beispiel: Formatierung in PDF mit XSL
18.2.3 Beispiel: Simuliertes XLink mit Dynamic HTML/JavaScript
18.2.4 Installation
19 XHTML: Neues HTML 4 — erweiterbar
19.1 Status quo: HTML neu definiert
19.2 Modulare Zukunft
20 Transformation von XML in WML und HTML
20.1 Erzeugen der WML-Dateien
20.2 Erzeugen der HTML-Dateien
21 Ausblick
21.1 XML Schema
21.2 Programmierung mit XML-Daten
21.3 XML und Java
21.4 Resource Description Framework
21.5 Die Zukunft
A Extensible Markup Language (XML) 1.0
A.1 Einleitung
A.1.1 Herkunft und Ziele
A.1.2 Terminologie
A.2 Dokumente
A.2.1 Wohlgeformte XML-Dokumente
A.2.2 Zeichen
A.2.3 Allgemeine syntaktische Konstrukte
A.2.4 Zeichendaten und Markup
A.2.5 Kommentare
A.2.6 Processing Instructions
A.2.7 CDATA-Abschnitte
A.2.8 Prolog und Dokumenttyp-Deklaration
A.2.9 Standalone-Dokumentdeklaration
A.2.10 Behandlung von Leerraum
A.2.11 Behandlung des Zeilenendes
A.2.12 Identifikation der Sprache
A.3 Logische Strukturen
A.3.1 Start-Tags, End-Tags und Leeres-Element-Tags
A.3.2 Elementtyp-Deklarationen
A.3.3 Attributlisten-Deklaration
A.3.4 Bedingte Abschnitte
A.4 Physikalische Strukturen
A.4.1 Zeichen- und Entity-Referenzen
A.4.2 Entity-Deklarationen
A.4.3 Analysierte Entities
A.4.4 Behandlung von Entities und Referenzen durch einen XML-Prozessor
A.4.5 Konstruktion des Ersetzungstextes von internen Entities
A.4.6 Vordefinierte Entities
A.4.7 Notation-Deklarationen
A.4.8 Dokument-Entity
A.5 Konformität
A.5.1 Validierende und nicht-validierende Prozessoren
A.5.2 Benutzen von XML-Prozessoren
A.6 Notation
A.7 Anhang A: Referenzen
A.7.1 Normative Referenzen
A.7.2 Weitere Referenzen
A.8 Anhang B: Zeichenklassen
A.9 Anhang C: XML und SGML (nicht normativ)
A.10 Anhang D: Expansion von Entity- und Zeichenreferenzen (nicht normativ)
A.11 Anhang E: Deterministische Inhaltsmodelle (nicht normativ)
A.12 Anhang F: Automatische Erkennung von Zeichenkodierungen (nicht normativ)
A.13 Anhang G: XML-Arbeitsgruppe des W3C (nicht normativ)
B Verknüpfen von Style Sheets mit XML-Dokumenten Version 1.0
B.1 Die xml-stylesheet-Processing-Instruction
B.2 Anhang A: Referenzen
B.3 Anhang B: Begründung
C Verhältnis von XML zu SGML und HTML
C.1 XML und SGML
C.2 XML und HTML
D Übersichten
D.1 Cascading Style Sheets
D.1.1 CSS-Eigenschaften und -Werte
D.1.2 CSS-Muster
D.2 DSSSL: Flow Objects
D.3 Syntax der XSLT-Elemente
D.4 DTD-Fragment für XSLT-Stylesheets (nicht normativ)
D.5 Relevante Spezifikationen und Organisationen
D.5.1 International Organization for Standardization
D.5.2 World Wide Web Consortium
D.5.3 Organization for the Advancement of Structured Information Standards
D.5.4 Internet Society und Internet Engineering Task Force
D.5.5 ISO-639-Sprachcodes
D.5.6 ISO-3166-Ländercodes
D.5.7 Zeichensatz ISO-Latin-1
D.5.8 Sonderzeichen
D.6 XML-1.0-Regeln

11.2 Linklisten erzeugen

Webmaster brauchen Links. In vielen Fällen, wenn nicht den meisten, residieren diese Links in statischen HTML-Seiten, die oft mühevoll auf dem neuesten Stand gehalten werden müssen. Mit XML und XSLT können die geplagten Verwalter des Web sich die Arbeit erleichtern. Den Anfang dessen soll die folgende Anwendung zeigen.

Wer Linklisten zur Verfügung stellt, tut das sicherlich überwiegend zu bestimmten Themen. XML wiederum bietet die Möglichkeit, sich eigene Dokumenttypen zu definieren, in denen Elemente und Attribute eine thematische Zuordnung vornehmen. Aus XML-Instanzen wiederum lassen sich über ein XSLT-Stylesheet beliebig viele statische HTML-Dateien erzeugenFussnoteBeim derzeitgen Stand der Geschwindigkeit von Java beziehungsweise Java-Programmen wie XT oder Saxon kann man Webmastern nicht dazu raten, diese Dokumente dynamisch zu liefern..

Zur Anwendung selbst. Ziel war es, unterschiedliche Produkte aus dem Web-Bereich online aufzulisten, in diesem Fall beschränkt auf zwei: Content-Management-Systeme und Application Server. Wollte man die Liste erweitern, wären HTML/XML-Editoren, Java-Entwicklungsumgebungen oder VRML-Werkzeuge denkbare Ergänzungen. Die folgende Dokumenttyp-Definition (DTD) berücksichtig die möglichen Erweiterungen dadurch, dass das Attribut catFussnotecat steht für Kategorie; ganz im Sinne der XML-Maxime, dass terseness of minimal importance sei. für die Produktgruppe keine konkrete Werteliste enthält (die immerhin auch erweiterbar wäre), sondern nur zwingend erforderlich ist. Außerdem enthält das Element prodgroup ein weiteres Attribut, das Basis für den Titel der HTML-Seite und deren Überschrift ist.

Die Produkte selbst müssen (als Attribut) natürlich unbedingt einen URL enthalten, denn sonst wäre das Ganze ja keine Linkliste. Zwei weitere Attribute bezeichnen die Produktversion und ob es sich um kommerzielle, Open Source oder Shareware handelt. Optional lassen sich auch besondere Eigenschaften und eine Kontaktperson festhalten.

<!ELEMENT software   ( prodgroup+ ) >
<!ELEMENT prodgroup  ( product+ ) >
<!ATTLIST prodgroup
          cat      CDATA   #REQUIRED
          title    CDATA   #REQUIRED >
<!ELEMENT product    ( company, pname, features?, contact? ) >
<!ATTLIST product
          url        CDATA   #REQUIRED
          version    CDATA   #REQUIRED
          status     ( commercial | free | shareware ) "commercial" >

<!ELEMENT company    ( #PCDATA ) >
<!ELEMENT pname      ( #PCDATA ) >
<!ELEMENT features   ( feature+ ) >
<!ELEMENT feature    ( #PCDATA ) >
<!ELEMENT contact    ( #PCDATA ) >
<!ATTLIST contact
          email      CDATA   #IMPLIED >
        
Hinweis

An dieser Kurz-DTD ist vielleicht schon zu erkennen, wie man sie, und damit die Anwendung, ausbauen könnte. Das Top-Level-Element könnte statt software ja auch linkliste heißen und an Elementen neben Softwareprodukten weitere beinhalten.

Ob die Daten in einem DBMS oder in einer Datei vorliegen sollen, ist eine Frage des Geschmacks und der Datenmenge. Gerade Listen, die eine recht einfache Struktur haben, setzen nicht viel voraus, um sie in einem DBMS zu organisieren. Wer etwa mit Linux und MySQL oder Windows NT und Access arbeiten will, benötigt dafür wahrscheinlich/hoffentlich keinen DatenbankadministratorFussnoteDas setzt im Falle von MySQL sicherlich das Engagement voraus, sich selbst als Adminstrator zu betätigen oder verzweifelt nach einem kompetenten Freund zu suchen.. Im vorliegenden Fall gehen wir von einer Datei aus, die etwa so aussiehtFussnoteUm keine Werbung zu machen, haben wir als Beispielprodukte solche aus dem Open-Source-Umfeld benutzt.:

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

<!DOCTYPE software SYSTEM "software.dtd">

<software>

  <prodgroup cat="cms" title="Content-Management-Systeme">

    <product url="http://www.opencms.org/" version="k.A."
      status="free">
      <company>Mindfact</company>
      <pname>OpenCms</pname>
    </product>

   <!-- weitere Content-Management-Systeme -->

  </prodgroup>

  <prodgroup cat="appsrv" title="Application Server">

    <product url="http://www.enhydra.org/"
      version="3.0" status="free">
      <company>[Lutris Technologies et al.]</company>
      <pname>Enhydra</pname>
    </product>

    <!-- weitere Application Server -->

  </prodgroup>

  <!-- weitere Produktgruppen -->

</software>
        

Um die Informationen in Dateien zu bringen, die a) die Content-Management-Systeme und b) die Application Server beinhalten, müssen entweder zwei Stylesheets vorhanden sein, die jeweils eine der beide Dateien schreiben, oder eins, das beide erzeugt. Zumindest in der aktuellen Version 1.0 sieht die XSLT-Spezifikation nicht mehrere Ausgabedateien vor. Die schon erwähnte XSLT-Implementierung Saxon von Michael Kay hingegen tut genau das, indem sie das auch in der Spezifikation vorgesehene Element xsl:output in Gestalt von saxon:output um das Attribut file erweitert. Aus eben diesem Grund kommt es hier — und in weiteren Beispielen (siehe etwa das Kapitel 20) — zum Einsatz.

Ein weiterer Grund für den Einsatz von Saxon sind andere Ergänzungen, die das Programm bietet: in diesem Fall das saxon:assign-Element, das es ähnlich dem xsl:variable erlaubt, einer Variablen Werte zuzuweisen, die zum Beispiel innerhalb des Attributs file nutzbar sind. Für die Benutzung von Saxon (das gilt auch für andere Werkzeuge, die Erweiterungen des Standards bieten) ist es nötig, ihren Namensraum im Element xsl:stylesheet anzugeben:

xmlns:saxon="http://icl.com/saxon"
         

legt fest, dass unter saxon:... immer ein Element zu verstehen ist, das Saxon-spezifisch ist und nicht dem XSLT-Namensraum (xsl:...) entstammt. Außerdem legt

extension-element-prefixes="saxon"
        

fest, dass diese Zeichenkette das Präfix für die erweiternden Elemente ist. Und schon die ersten Zeilen des weiter unten vollständig abgedruckten Stylesheet-Listings deuten an, dass es hier auch darum geht, die Ausgabe in ein Verzeichnis zu dirigieren:

<xsl:variable name="dir">html</xsl:variable>
<xsl:variable name="filesep" 
      select="system-property('file.separator')" />
<xsl:variable name="currentgroup"/>
        

Diese Variablenzuweisungen (siehe auch den Abschnitt 10.4.5 und 10.4.6) sind die Vorbereitung dafür, die Ausgabe in ein Verzeichnis namens html zu lenken. Und filesep zeigt die in Java angestrebte Portabilität, denn ob vorwärts oder rückwarts gewandter Schrägstrich, das Stylesheet wird betriebssystemkonform arbeiten.

In den Templates für den Wurzelknoten und das Top-Level-Element software geschieht nichts, außer dass die Templates für die Kindelemente aufgerufen werden. Erst das Template für das Element prodgroup enthält die zentralen Bestandteile des Stylesheets. Der Grund dafür liegt darin, dass für jede Produktgruppe eine eigene Datei erzeugt werden sollFussnoteMüsste das Stylesheet für jedes Produkt eine Datei generieren, wären entsprechende Statements wie vor allem saxon:output im Element product zu platzieren..

Einer der entscheidenden Punkte in dem Stylesheet, das die Dateien produziert, ist der Aufruf des Elements saxon:output, das, wie angedeutet, über die Möglichkeit verfügt, die Ausgabe in über Variable definierte Dateien zu lenken. Die oben erwähnten Variablen dir und filesep ergeben html/, und currentgroup repräsentiert das Attribut cat (die Zeichenkette .html folgt am Schluss), sodass der Wert des Attributs file entweder html/cms.html oder html/appsrv.html ist.

<saxon:output file="{$dir}{$filesep}{$currentgroup}.html"
  method="html" indent="yes"
  doctype-public="-//W3C//DTD HTML 4.0 Transitional"
  doctype-system="http://www.w3.org/TR/REC-html40">
  ...
<saxon:output>
        

docptype-public und doctype-system beziehungsweise ihre Werte bewirken, dass in der Zieldatei der Dokumenttyp in der richtigen Form steht:

<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.0 Transitional" "http://www.w3.org/TR/REC-html40">
        

Innerhalb des saxon:output-Elements steht genau das, was das Stylesheet ausgeben soll. Das fängt an mit Elementen wie html, head, body oder table, die ohne Namensraumbezeichner verwendet werden können, weil der HTML-Namensraum in xsl:stylesheet als einziger ohne einen solchen Zusatz deklariert wird. Vieles von dem, was im Element prodgroup steht, ist Beiwerk für die HTML-Seite: Verweis auf ein CSS-Stylesheet, Menüeinträge et cetera. Die ebenso entscheidende wie aussagelose Zeile in diesem Template ist:

<dl><xsl:apply-templates/></dl>
        

Sie stößt die weitere Stylesheet-Arbeit an. Und die erledigen die Templates für die anderen Elemente. In denen ist es vor allem das Template für product, das noch etwas tut. Mittels eines xsl:if weist es den einzelnen Produkten einen Farbtupfer zu, je nachdem ob es sich um ein kommerzielles oder frei erhältliches handelt. Im Template für den Produktnamen muss der URL eingebaut, das heißt dem Element a als xsl:attribute zugewiesen werden.

Bleibt uns noch, das Listing insgesamt und natürlich einen Screenshot zu zeigen.

appsrv.html zeigt die Application
  Server mit der Zusatzinformation, ob sie kommerziell oder
  Open Source sind

Abbildung 35: appsrv.html zeigt die Application Server mit der Zusatzinformation, ob sie kommerziell oder Open Source sind

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

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/TR/REC-html40"
  xmlns:saxon="http://icl.com/saxon"
  extension-element-prefixes="saxon">


<!-- Parameter  und Variable -->
<xsl:variable name="dir">html</xsl:variable>
<xsl:variable name="filesep" 
       select="system-property('file.separator')" />
<xsl:variable name="currentgroup"/>

<!-- ....................Root............... -->
<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<!-- ............Element software........... -->
<xsl:template match="/software">
  <xsl:apply-templates/>
</xsl:template>

<!-- ............Element prodgroup.......... -->
<xsl:template match="prodgroup">
  <saxon:assign name="currentgroup">
   <xsl:value-of select="@cat"/>
  </saxon:assign>

  <saxon:output file="{$dir}{$filesep}{$currentgroup}.html"
    method="html" indent="yes"
    doctype-public="-//W3C//DTD HTML 4.0 Transitional"
    doctype-system="http://www.w3.org/TR/REC-html40">
  <html>
     <head>
       <meta name="author" content="Henning Behme" />
       <link title="software" type="text/css" rel="stylesheet"
         href="sw.css"/>  
       <title><xsl:value-of select="@title"/></title>
     </head>

     <body>
       <table align="left" width="100%" border="0" cellspacing="0"
          cellpadding="0">

             <!-- erste Tabellenreihe -->

         <tr><td width="25%" valign="top" rowspan="2">

             <p><a href="/ix/raven/"><img
	  src="/ix/images/raven/raven.sm.gif" width="99"
	  height="86" border="0" alt="theRaven"/></a>

             <br/><a href="/ix/"><img
             src="/icons/buttons/ix.gif" width="80"
             height="20" border="0" alt="iX"/></a>

             <br/><br/><a href="/ix/raven/Web"><span
             class="menu">Web@iX</span></a>

             <br/><br/><a href="appsrv.html"><span
             class="menu">AppServer</span></a>

             <br/><a href="cms.html"><span
             class="menu">CMS</span></a></p></td>

             <!-- rechte Tabellenteile -->

             <td><h1><xsl:value-of select="@title"/></h1></td></tr>

             <!-- zweite Tabellenreihe -->

             <tr><td>
                 <p class="nocss">Ein
                 Styleeshet-fähiger Browser würde sich gut machen
                 ;-)<br/>
                 A stylesheet-enabled browser would come in handy ;-)</p>
                 <hr noshade="noshade" size="1"/>
                 <p><img src="/ix/images/dots/1dred.gif" 
                         width="8" height="8"
                         alt="commercial product"/>
                    <img src="/ix/images/dots/1tr.gif"
                         width="5" height="1" alt="space"/>
                    <strong>kommerzielles Produkt - </strong>
                    <img src="/ix/images/dots/1dgreen.gif" 
                         width="8" height="8"
                         alt="open source"/>
                    <img src="/ix/images/dots/1tr.gif"
                         width="5" height="1" alt="space"/>
                    <strong>Open Source</strong></p>
                 <dl><xsl:apply-templates/></dl>

             <!-- ---------------------- foot -------------- -->

             <hr width="85%" noshade="noshade" size="1"/>

             <p>Last modification: March 11,
             2000 by <a href="/ix/editors/hb.html">hb</a>.
             <br/>Complaints, suggestions to <a
             HREF="mailto:www@ix.heise.de">
             <em>iX</em>'s webmaster</a></p>

             </td></tr>
           </table>

         </body>
     </html>
  </saxon:output>
</xsl:template>

<!-- ............Element product............... -->
<xsl:template match="product">
  <dt><xsl:if test="@status='commercial'">
       <img src="/ix/images/dots/1dred.gif"
            width="8" height="8" alt="commercial product"/>
       <img src="/ix/images/dots/1tr.gif"
            width="5" height="1" alt="space"/>
      </xsl:if>
      <xsl:if test="@status='free'">
       <img src="/ix/images/dots/1dgreen.gif"
            width="8" height="8" alt="open source"/>
       <img src="/ix/images/dots/1tr.gif"
            width="5" height="1" alt="space"/>
      </xsl:if>
      <xsl:if test="@status='shareware'">
       <img src="/ix/images/dots/1blueish.gif"
            width="8" height="8" alt="shareware"/>
       <img src="/ix/images/dots/1tr.gif"
            width="5" height="1" alt="space"/>
      </xsl:if>
      <xsl:apply-templates select="pname"/>
      <xsl:text> [Version: </xsl:text>
      <xsl:value-of select="@version"/>
      <xsl:text>]</xsl:text>
  </dt>
  <dd><xsl:apply-templates select="company"/>
    <xsl:if test="features">
      [besondere Eigenschaften: <xsl:apply-templates select="features"/>]
    </xsl:if>
  </dd>
</xsl:template>

<!-- ............Element pname............... -->
<xsl:template match="pname">
  <strong><a>
    <xsl:attribute name="href">
      <xsl:text>http://</xsl:text>
      <xsl:value-of select="ancestor::product/@url"/>
    </xsl:attribute>
    <xsl:apply-templates/></a></strong>
</xsl:template>

<!-- .......Elemente features | company | feature -->
<xsl:template match="features | company | feature">
  <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>
        

Valid HTML 4.01!Valid CSS!