copyright (c)2003-2005   useGroup
XSLT

66151@usegroup.de

Einführung in XML/XSLT

Anhang C: Druckversion

nach untenDruckversion

Druckversion

nach obenDruckversion 

(Einführung in XML/XSLT)

copyright (c)2003-2005   useGroup

Version dieses Dokumentes

nach obenVersion dieses Dokumentes 

V1.00 vom 10.7.2001



Was Sie lesen sollten

nach obenWas Sie lesen sollten 

Wenn Sie zuerst einmal wissen wollen, ob XSLT das Richtige für Sie ist, oder schnellstmöglichst zuerst einmal eine XML-Datei "hochstellen" möchten, lesen Sie bitte den Quickstart. Wenn Sie



Lizenz

nach obenLizenz 

      Copyright (c) 2001 usegroup.
      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.1
      or any later version published by the Free Software Foundation;
      with the Invariant Sections being Vorwort, with no
      Front-Cover Texts, and with no Back-Cover Texts.
      A copy of the license is included in the section entitled 
      "GNU Free Documentation License".



Änderungen an diesem Dokument

nach obenÄnderungen an diesem Dokument 

Wenn Sie Änderungen an diesem Dokument vornehmen möchten, lesen Sie bitte model.html.



Links

nach obenLinks 

Im Internet gibt es verschiedene gute XSLT-Seiten wie

Auf viele dieser Ressourcen kann man über die iX-Seiten gelangen.
Empfehlen würde ich auch das Buch XSLT Programmer's Reference von Michael Kay, 777 Seiten, Englisch, 34,99$US von Wrox, ISBN 1-861003-12-9.
Mehr auf XML-Programmierung und DTDs richtet sich Henning Behme und Stefan Minterts XML in der Praxis, erschienen bei Addison-Wesley unter der ISBN 3-8273-1636, 512 (deutsche) Seiten für 79,90DM; Auch online unter www.mintert.com/xml/.



Was ist XML?

nach obenWas ist XML? 

XML (eXtensible Markup Language) ist eine Datenbeschreibungssprache. Das heißt, dass jede Art von Daten (z.B. ein Textverarbeitungs- oder Tabellenkalkulationsdokument, eine Homepage oder eingeschränkt Grafikdaten (bislang nur Vektordaten) in einem XML-Format beschreiben lassen). Sie denselben Vorgänger wie HTML, nämlich SGML (und sie ähnelt HTML: Tags sollten Ihnen bekannt vorkommen). Auch definiert XML einen Nachfolger für HTML, XHTML, der gewisse Vor-und Nachteile hat, doch dazu später.
Hier eine kurze Beschreibung von XML:

in diesem Artikel soll nur gezeigt werden, wie man DTDs und XSLT, XHTML und Schemata anwendet.



Was ist XSLT?

nach obenWas ist XSLT? 

XSLT (eXtensible Stylesheet Language Transformations) ist ein Werkzeug, von einem XML-Format ins andere zu konvertieren. XSLT kann z.B. benutzt werden um von einem Eigenformat in eine XHTML-Datei zu konvertieren. XSLT hat gegenüber CSS den Vorteil, dass es Transformieren kann, d.h. Elemente mehrmals und an verschiedenen Positionen verwenden kann (die Tags z.B. von hinten nach vorne zeigen kann). Richtig vorteilig wirds dann bei Verzeichnissen für Inhalt, Stichwörter und Bilder: XSLT kann sich die entsprechenden Informationen aus den Dateien nehmen und automatisch ein Inhaltsverzeichnis aufstellen (so geschehen in index.html).
Die Trennung von Struktur und Inhalt
HTML war von Anfang an dazu gedacht, zu definieren, welche Stellen im Dokument z.B. Überschriften sind und welche betont werden sollen. Der Browser entschied, wie die Dokumente darzustellen waren - und hat aber wirklich Jeden, der entfernt was von Design verstand ziemlich die Wände hochgehen lassen (die Seiten sahen selten auf zwei Browsern gleich aus). Sehr spät hat das W3C seinen Fehler eingesehen hat und den Benutzern mit CSS ein Werkzeug an die Hand gegeben hat um das Aussehen ihrer Seiten genauer und Browserunabhängig festlegen zu können.
Nichtsdestotrotz haben sich die Entwickler von großen Seiten ein Beispiel an dem tollen WYSIWYG (What You See Is What You Get, also dem gleich-aussehen des Ergebnisses mit der Anzeige in der Arbeitsumgebung) genommen, dass viele Seiten mehr oder weniger eingefroren sind. Ich habe zum Beispiel an einem Projekt konventionell mitarbeiten müssen, das aus je 200 Dateien in 7 Sprachen bestand. An sich ist das noch kein Problem, nur wenn Optik oder Inhalt geändert werden sollen (und sie sollten), sind oft redundante Arbeiten auszuführen (an denselben Tags in verschiedenen Dateien etwas ändern) oder die Änderungsstellen werden schwer gefunden.
Dagegen hilft eine weitere Schicht, die Strukturschicht. Ich definiere also selbst Tags die beschreiben, welche Information mit der Absatz liefert und später sage ich wie diese Information(en) dargestellt werden sollen.
Inhalt (z.B. Dies ist ein Artikel über XML).
Struktur (<Artikelanfang>Dies ist ein <Stichwort>Artikel über XML</Stichwort> <Artikelende>)
Darstellung: Stichwörter unterstreichen.
Ergebnis: Dies ist ein

Artikel über XML

Wenn ich jetzt 10000 HTML-Seiten schriebe und plötzlich auf die Idee käme, Stichwörter entsprechend irgendeiner Norm blau zu schreiben, wäre das durch die (einmalige) Änderung der Darstellungsschicht erheblich leichter als durch eine Änderung von 10000 HTML-Dateien. Das ist ein Grund, warum XSLT genial ist - und auch der Grund, warum es erst ab einer gewissen Projektgröße beziehungsweise Änderungshäufigkeit Sinn macht. Die Strukturschicht zwingt zu einem leichten Mehraufwand - der Definition, welchen Zweck ein Abschnitt entpricht und der späteren Definition, wie dieser darzustellen ist. Sinn macht XSLT allerdings auch dann, wenn ich darauf angewiesen bin, die Dateien z.B. in verschiedenen XML-Formaten weiterzugeben.
Ein weiterer Punkt ist: Wenn man in einem Team arbeitet und sich geeinigt hat, welche Inhalte beschrieben werden (man sich also auf alle Tags und Attribute geeinigt hat), kommt man i.d.R. mit einem sehr groben Arbeitslayout aus und die Gruppen können gleichzeitig am Layout (sprich der XSLT-Datei), an der DTD (falls gewünscht) und am Inhalt arbeiten.



Was ist XHTML?

nach obenWas ist XHTML? 

HTML ist einne Untermenge des SGML-Dateiformat (Standard Generalized Markup Language). XML ist eine kleinere Untermenge der SGML-Möglichkeiten und XHTML ist ein XML-Dateiformat.

Vorteile:

Nachteile: Alle HTML-Dateien dieses Projekts sind übrigens XHTML. Das hat den Grund weil sie per XSLT aus einem proprietären XML-Format erzeugt wurden.



Was sind DTDs?

nach obenWas sind DTDs? 

DTD (Document Type Definitions) sind Dateien die beschreiben, welche Tags mit welchen Attributen an welchen Stellen eines bestimmten XML-Formats erlaubt sind. Da die Korrektheit der Tags ganz erheblichen Einfluss darauf hat, ob die Dateien überhaupt angezeigt werden können, gibt es für fast jedes XML-Format ein DTD oder Schema (mehr dazu gleich).
Auch sind sie eine wertvolle Hilfe beim Debugging und beim Schreiben (Emacs mit DTD-Unterstützung zeigt zum Beispiel alle Tags die im aktuellen Kontext verwendet werden dürften).
DTDs werden vom XML-Parser verarbeitet und können den Anwender z.B. mit Fehlermeldungen wie "Tag unknown in line 44" weiterhelfen.
DTDs haben einen Haken: Sie können keine Datentypen überprüfen. Das Tag Kundennummer kann letztendlich nur als Zeichenfolge (PCDATA) deklariert werden, sollten Kundennummern etwa mit Buchstaben oder Sonderzeichen vorkommen, muss jeder (bzw. jedes Programm das es anzeigen soll) selbst sehen, wie er zurecht kommt ;( Dieses Manko beheben XML Schemata die seit dem 24.10.2000 W3C-Empfehlung sind.



Was sind Schemata?

nach obenWas sind Schemata? 

Schemata sind Dateien, die ähnlich wie DTDs die Gültigkeit eines Dokuments beschreiben. Anders als diese arbeiten Schemata jedoch nicht Dokumenten- sondern Datenorientiert, kennen also verschiedene Datentypen. Mit Schemata können Sie z.B. vorgeben, dass ein Attribut nur eine Postleitzahl und ein Element nur eine Artikelnummer beinhalten darf. Sie können dann die Datentypen Postleitzahl z.b. als fünfstellige Nummer definieren und Artikelnummer aus einer Folge dreier Buchstaben, einem Bindestrich und 4 bis 5 Zahlen.
Der Vorteil: Werden die XML-Daten maschinell ausgewertet können Fehler der Eingabe schon früh vermieden werden. Teilweise kann sogar ganz auf eigene Überprüfungsroutinen, z.B. ob das Element eine Zahl ist, verzichtet werden.



XSLT-Quickstart

nach obenXSLT-Quickstart 

Hier die Schritte wie Sie ein XSLT-Projekt ins Netz bekommen:

Beim Schreiben der XML-Datei müssen Sie entweder nach einem gewissen DTD oder Schema handeln, wenn Sie ein schon bestehendes XML-Format umwandeln möchten, oder Sie können sich eigene Tags ausdenken - für die Sie dann ein DTD oder Schema schreiben können und vor allem eine XSL-Datei (sprich XSLT-Transformation) schreiben sollten.
Als Ausgabe muss nicht XHTML erfolgen, alle anderen XML-Formate (SVG, MathML, DocBookXML, viele andere oder wiederum ein selbstdefiniertes Format sind möglich).
Eine Konvertierung in HTML kann unnötig sein wenn Ihr Browser XSLT unterstützt (dann stellen Sie einfach die XSL-Datei und die XML-Datei online und sprechen die XML-Datei an). Der Microsoft Internet Explorer tut das ab 5, Mozilla ab 0.91 (entspricht Netscape ab 6.1 Preview).
Das ist jedoch selten mehr als ein theoretisches Feature, z.B. unterstützt IE nur sogenanntes MSXML, also kein XML nach W3C; auch stellt Mozilla 0.91 das Tutorial nicht korrekt dar. Zur Programmierung des IE-XSLT-Parsers siehe SelfXML.
Das ist auch der Grund, warum alle XML- und XSL-Dateien im Sample/-Verzeichnis aus diesem Text als .xml.txt bzw. .xsl.txt angesprochen werden (im Samples-Verzeichnis liegen auch die Originaldateien): um sie in einem Editor laden zu lassen - der Internet Explorer stellt sie wie gesagt nicht korrekt dar, obwohl er und Netscape ab 6.1 eigentlich auch XSLT-Transformationen übernehmen sollten...



Was Sie erwartet

nach obenWas Sie erwartet 

In dieser Datei werden XML-Begriffe geklärt und die Navigation in einem XML-Dokument aufgezeigt. Diese Navigation sollte Ihnen bei den XSLT-Kapiteln besonders hilfreich sein.



well-formed

nach obenwell-formed 

Ein Document ist dann "well-formed", also als XML zu erkennen wenn es den XML-Gesetzen in der Weise gehorcht, dass



valid

nach obenvalid 

Ein Dokument ist dann valid, also gültig, wenn es wellformed ist und dem DTD und/oder dem Schema gehorcht, der/das/die im Dateikopf angegeben wurde/n. (Ein Dokument kann sowohl einem DTD als auch einem Schema gehorchen müssen)



Import-Präzedenz

nach obenImport-Präzedenz 

Sollte zwei gleichermaßen zutreffende Tags gefunden werden,


    <!-- für Tag b ist definiert -->
    <xsl:template match="b">
    Wird angewendet
    </xsl:template>
    <!-- und -->
    <xsl:template match="u|i|b">
    Wird in dem Fall für b nicht angewendet
    </xsl:template>
    
  
entscheidet die Import-Präzedenz darüber, welches Template zur Ausführung kommt. Das ist in der Regel das oberste, wobei bei eingebundenen (xsl:include) oder importierten (xsl:import) Templates das Importierte gegenüber dem in der Datei definierte immer das Nachsehen hat.
Wenn Sie z.B. an einer Stelle hinter einem
  <xsl:template match="bsp">
  <b>
    <xsl:apply-templates/>
  </b>
  </xsl:template>
  
ein Include oder Import verwenden, die ebenfalls für bsp eine Transformation z.b. als kursiv definieren, wird bsp trotzdem immer nur fett angezeigt. Wenn Sie in einer anderen Datei zuerst ein Import ausführen das bsp kursiv macht und dann ein Include, das es fett mcht, wird es wiederum fett, weil Include eben eine höhere Präzedenz hat.



Namespaces

nach obenNamespaces 

Namensräume (Namespaces) sind die XML-Empfehlun wie man verschiedene XML-Formate in einem Dokument verwenden kann (man schreibt einfach den Namespace prefix, z.b. xsl mit einem Doppelpunkt vor das verwendete Kommando).
Der Eintrag in einer XSL-Datei

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/TR/REC-html40">

Bedeutet z.B. der Namespace xsl (xmlns:xsl) wird für XSLT-Befehle benutzt. Theoretisch ist auch ein anderer Wert als XSL möglich, dann müssten die Befehle auch anders aufgerufen werden (anstelle xsl:apply-templates z.b. xslt:apply-templates).
XSL ist allerdings für den XSLT-Namespace zu einem de-facto-Standard geworden.



Navigation im XML-Dokument

nach obenNavigation im XML-Dokument 

Eine XML-Datei wird oft mit einem Baum verglichen, wobei jedes Tag einen weiteren Ast vom aktuellen Ast abspaltet abspaltet - der wiederung weitere Äste haben kann. Die Wurzel, also das höchste Tag und gleichzeitig der erste Ast ist /.
Die Elemente werden ähnlich wie Verzeichnisse auf einem Linux-Computer angesprochen (Unterschiede zu Windows-Verzeichnissen: es wird auf Groß/Kleinschreibung geachtet und man trennt nicht durch \ sondern durch /). Man kann alle Elemente absolut und lokal ansprechen. /datei/abschnitt/satz spricht z.B. nur die Berliner an:

<datei>
<satz inhalt="kein berliner">
Ich bin kein Berliner
</satz>

<abschnitt>
<satz inhalt="berliner">
Ich bin ein Berliner
</satz>
<satz>
Ich bin auch ein Berliner
</satz>
</abschnitt>
</datei>

Außerdem ist es möglich, gezielt jedes Vatertag anzusprechen (siehe z.B. Parent), das bestimmten Bedingungen genügt, jedes Kind-Tag usw.. Ein möglicher Stammbaum an dem man die Bennenung der Elemente sehr gut ersehen kann ist:



//

nach oben// 

//satz spricht jeden Satz, egal in welchem Tag an, also alle drei Sätze.



|

nach oben| 

Der vertikale Strich bedeutet soviel wie ein "oder". Um im Beispiel zu bleiben bedeutet ein satz|abschnitt, dass sowohl Sätze, als auch Abschnitte mit diesem Template behandelt werden (passt zu Satz oder Abschnitt).



.

nach oben. 

Der Punkt spricht das lokale Element an. Bsp:

<xsl:value-of select="."/>
gibt das lokale Element aus.



@

nach oben@ 

Der Klammeraffe spricht die Attribute an, /datei/satz/@inhalt z.B. "kein Berliner". Beim lokalen Element reicht "@attributname", ein Punkt ist hier nicht nötig.



@*

nach oben@* 

Bedeutet: Selektiere sowohl alle Attribute als auch den Taginhalt. Praktisch ist das z.B. beim Kopieren von Elementen.



self::tagname

nach obenself::tagname 

Entspricht dem Tagnamen des aktuell selektierten Elements.

<xsl:apply-templates select="*[not(self::s)]"/>
Wendet alle Templates an, die nicht den Tag "s" verarbeiten.



preceding-sibling::

nach obenpreceding-sibling:: 

Wählt das vorhergegangene gleichrangige (sibling=Geschwister)-Tag aus.

<xsl:apply-templates select="*[not(preceding-sibling::s)]"/>
Wendet alle Templates auf Tags an, die nicht NACH den Tag "s" verarbeitet werden.



following-sibling::

nach obenfollowing-sibling:: 

Wählt das nachkommende gleichrangige (sibling=Geschwister)-Tag aus.

<xsl:apply-templates select="*[not(following-sibling::s)]"/>
Wendet alle Templates auf Tags an, die nicht VOR den Tag "s" verarbeitet werden.



parent::

nach obenparent:: 

Wählt das Tag eine Ebene höher aus.

<xsl:apply-templates select="*[not(parent::s)]"/>
Wendet alle Templates auf Tags an, die nicht als direktes Kind zu einem "s"-Tag definiert wurden.
Wollen Sie ein Attribut des höheren Tags ansprechen, sollten Sie ../@ATTRIBUTNAME verwenden.



ancestor::

nach obenancestor:: 

Wählt das Tag mindestens eine Ebene höher aus.

<xsl:apply-templates select="*[not(ancestor::s)]"/>
Wendet alle Templates auf Tags an, die nicht als direktes Kind zu einem "s"-Tag oder einem dessen Untertags (... den Untertags der Untertags ...) definiert wurden.



child::

nach obenchild:: 

Wählt das Tag eine Ebene tiefer aus.

<xsl:apply-templates select="*[not(child::s)]"/>
Wendet alle Templates an, die nicht ein direktes "s"-Tag als Kind haben.



descendant::

nach obendescendant:: 

Wählt das Tag mindestens eine Ebene tiefer aus.

<xsl:apply-templates select="*[not(descendant::s)]"/>
Wendet alle Templates an, die nicht ein "s"-Tag als Kind oder Kind eines Kindes (...) haben.



XHTML

nach obenXHTML 

Um von HTML auf XHTML umzusteigen, müssen Sie folgende Dinge beachten:



XHTML-Tags

nach obenXHTML-Tags 

Die folgenden Tags sind in XHTML 1.1 definiert:

Anwendung Tag
Text a, abbr, acronym, address, b, big, blockquote, br, cite, dfn, div, em, h1, h2, h3, h4, h5, h6, hr, i, kbd, p, pre, q, quote, samp, span, small, strong, sub, sup, tt, var
Formulare button, fieldset, form, input, label, legend, option, optgroup, select
Tabelle caption, col, colgroup, table, tbody, td, tfoot, th, thead, tr
Listen dl, dd, dt, ol, ul, li
Bilder img
Wer suchet, der nicht findet: blink ist Gott sei Dank schon lange verschwunden (genaugenommen nie aufgetaucht), font und center gibt es nicht mehr: Diese soll man durch entsprechenden Einsatz von div ersetzen (<center> durch <div align="center">Text</div>, font z.B. durch <div style="color:#ff0000; font-size:12pt">). Grund: Es waren keine vom W3C definierte Tags und Sie beschrieben auch nicht die Struktur (wie z.B. cite), sondern die Darstellung. Dafür hat das W3C allerdings CSS gelauncht.
Die Liste ist übrigens wahrscheinlich unvollständig; wichtige Tags wie img und a fehlten.



Was ist DocBook?

nach obenWas ist DocBook? 

Docbook ist ein SGML-Format, das für Veröffentlichungen bestimmt wurde. Es gibt jedoch ein XML-Format, DocBook/XML. Wie Sie aus dem Vorwort wissen sollten, ist XML eine Teilmenge von SGML, Docbook/XSL ist jedoch nicht notwendigerweise eine Teilmenge von Docbook (Sie können alles machen, was Sie mit Docbook/SGML auch können, nur machen Sie einige Dinge anders). Zur Verdeutlichung der Beziehung von SGML und XML hier ein Diagramm Mengendiagramm SGML und HTML.



Warum der Name?

nach obenWarum der Name? 

Der Name Docbook ist aus folgenden Gründen sinnvoll:

nicht sinnvoll:



Was ist XML:FO

nach obenWas ist XML:FO 

XML:Formatting Objects ist ein vom W3C abgesegnetes XML-Dateiformat, das für Print-Medien optimiert wurde. Anders als in den meisten anderen XML-Formaten, deren Tags sagen, was ein Element ist, und nicht wie es dargestellt werden soll, befassen sich die Tags von XML:FO ausschlie�ich damit, wie die Elemente auf Print-Medien darzustellen sind. XML:FO-Prozessoren wie der Apache FOP generieren daraus dann Druckvorstufen, der Apache FOP beherrscht z.B. auch PDF. Wir werden die XSLT-Transformationen von Docbook auf XML:FO benutzen, um ein PDF zu erstellen, und die von Docbook auf XHTML um eine XHTML-Seite zu erstellen.



Ein Testsystem

nach obenEin Testsystem 

Um anständig mit Docbook/XML arbeiten zu können empfehle ich Ihnen folgende Dateien:



Ein Beispiel-Buch

nach obenEin Beispiel-Buch 

Wählen Sie in Ihrem XML-Editor "neues Dokument" basierend auf der Docbook DTD (je nachdem wohin Sie sie entpackt haben). In XML-Spy bevorzuge ich die Textansicht .

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE set SYSTEM ".\dtds\docbookx.dtd">
  <set>
    <book>
    <chapter>
      <title>Mein erstes Kapitel</title>
      <para>Hier ist ein Absatz</para>
      <sect1>
        <title>Ein Abschnitt im Kapitel</title>
        <para>Mindestens ein Absatz im Aschnitt macht ihn DTD-Gerecht.</para>
      </sect1>
      </chapter>
    </book>
  </set>
Quelle: Mark Galassi's DocBook/SGML-Tutorial



Bilder in Docbook

nach obenBilder in Docbook 

Eine Möglichkeit, Bilder einzubetten, besteht in der Kombination aus inlinemediaobject, imageobject und imagedata. Wie der Name schon sagt, wird das Bild dann inline, also ohne Umlauf oder Ausrichtung eingebaut.

  <inlinemediaobject>
    <imageobject>
      <imagedata fileref="dateiname.jpg" format="JPG"/>
    </imageobject>
  </inlinemediaobject>



Zeilenumbruch (Breaks) erzwingen

nach obenZeilenumbruch (Breaks) erzwingen 

Normalerweise wird man Zeilenumbrüche in Docbook durch Absätze (<para>...</para>) herbeiführen. Diese werden in HTML jedoch sinnhafterweise mit <p>...</p> übersetzt, einen einfachen Zeilenumbruch, sprich etwas, was die Ausgabe eines <br/> in der HTML-Ausgabe erzeugt, ist nur durch die Verwendung von Literallayout möglich. Um Literallayout anwenden zu können, müssen zunächst alle Absätze beendet werden. Das Literallayout ist dabei in etwa vergleichbar mit dem HTML-Preformatted-Tag <pre>...</pre>: Ein Zeilenumbruch in der Quelldatei führt zur Erzeugung eines Zeilenumbruchs in der Ausgabe.

  <para>
    Ein Absatz ohne Zeilenumbruch
  </para>
  <literallayout>
    Ein Absatz mit Zeilen-
    umbruch
  </literallayout>
  <para>
    Ein weiterer Absatz ohne Zeilenumbruch
  </para>



Links

nach obenLinks 

Links werden in DocBook mit ulink realisiert.

  <ulink url=”http://www.google.de”> Linktext </ulink>



Kursiver Text

nach obenKursiver Text 

Text können Sie kursiv darstellen, wenn Sie das emphasis-Tag mit der kursiven "role" verwenden.

  <emphasis role="italic">italic emphasized</emphasis>



Fußnoten

nach obenFußnoten 

Verwenden Sie footnote im Text um an der entsprechenden Stelle eine Fußnote einzufügen. Darin sollten Sie Text als Absatz (para) formatieren.

<footnote id="fnid1"><para>A footnote</para></footnote>



Metadaten über Artikel

nach obenMetadaten über Artikel 

Als per <set>-<book> als ganzes Buch auszuzeichnen können Sie auch den leichtgewichtigeren article verwenden: Artikel können (oder sollten) mit Metadaten ausgezeichnet werden, vom Titel über Datum und Autor bis hin zu Stichwörtern, die in einer subjectset-subject-subjectterm-Konstellation angegeben werden können.

	
<article>
<articleinfo>
  <title>XYY</title>
  <corpauthor>usegroup</corpauthor>
  <date>2005-04-04</date>
  <subjectset>
    <subject>
      <subjectterm>
        Others
      </subjectterm>
    </subject>
  </subjectset>
</articleinfo>

<para>
Ein Abschnitt
</para>
</article>



Export als XHTML

nach obenExport als XHTML 

Wenn Sie diese Datei möhten z.B. als XHTML ins Netz stellen möchten, müssen Sie zuerst einmal einfgen, dass das entsprechende XSL-Stylesheet verwendet werden soll.
Mit dem Befehl

saxon -o index.html docbook.xml html/docbook.xsl
erstellen Sie dann aus der Docbook.xml mithilfe den Style Sheets in html/docbook.xsl die Index.html. Anstelle html/docbook.xsl können Sie natrlich auch IhrenPfadZuDenStyleSheets/html/docbook.xsl angeben, nur sollten Sie bei diesem Pfadnamen gnädigerweise auf Abstände verzichtet haben.



Export als PDF

nach obenExport als PDF 

PDFs bekommen Sie aus einem Docbook, indem Sie zuerst eine Ausgabe in XML:FO erstellen:

saxon -o index.fo docbook.xml fo\docbook.xsl
Und an die PDF-Datei kommen Sie dann ganz einfach mit einem FO-Prozessor dran:
fop index.fo index.pdf
Interessanterweise bringt ebendiese Zeile bei meinen 1.50ern Style Sheets die Meldung
[Error]: The id "toc...d47e3" already exists in this document
Was sich aber umgehen lässt indem man eine der beiden "toc...d47e3"s in einen anderen Wert, z.B. "toc...d47e4" ändert. Dann ist auch die PDF-Datei größer als 15 Bytes und lässt sich lesen. Das scheint nebenbei ein Problem im FOP-Prozessor und nicht in der Transformation zu sein. Lars Trieloff (http://trieloff.net/docbook/distfiles/XML-Flatener/superfop.jar, danke für den Hinweis) bietet eine gepatchte FOP-Version.



Kommentare

nach obenKommentare 

Kommentare werden in XSLT geschrieben als

<!-- Kommentar -->
Diese Kommentare werden i.d.R. nicht in die Ausgabe übernommen, möchten Sie (z.b. für eine leichtere lesbarkeit) Kommentare in den erzeugten HTML-Text schreiben, müssen Sie die Kommentare in ein xsl:comment-tag einbetten.
<xsl:comment>< Kommentar, der übernommen wird ></xsl:comment>



xsl:text

nach obenxsl:text 

Der gesamte Text in der XSL-Datei, der ausgegeben werden soll, müsste streng genommen in xsl:text - Tags stehen. Genaugenommen wird er aber auch ausgegeben, wenn er nicht in diesen Tags steht.



xsl:template
*name

nach obenxsl:template 

Ein Template (zu deutsch: Vorlage) ist das zentrale Element in XSLT: dort werden alle Tagumwandlungen und Positionierungen vorgenommen. Beispiel: samples/xslt1.xml und samples/xslt1.xsl.

--- datei xslt1.xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<?xml-stylesheet href="xslt1.xsl" type="text/xsl"?> 
<hello-world>
Hallo Welt!
</hello-world>
--- datei xslt1.xsl
<?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">

<xsl:output method="html"/>

<xsl:template match="/">
<html>
  <body>
   <xsl:apply-templates/>
  </body>
</html>

</xsl:template>


</xsl:stylesheet>

Daraus können Sie z.B. mit "saxon -a -o xslt1.html xslt1.xml" eine HTML-Datei erstellen wenn Sie Instant Saxon benutzen.
Erklärung:
xsl:template match="/" wählt sich das tiefste Tag (hello-world), gibt zuerst einmal <html><body> aus und "wendet die Templates an". Danach wird noch </body></html> ausgegeben und die Transformation beendet. Templates anwenden heißt, dass alle Kind-Tags ausgewertet werden und Text innerhalb des Tags geschrieben wurde, ausgegeben wird. Sollte ein Kind-Tag nicht definiert sein, wird auch dessen Inhalt als Text ausgegeben, das Tag selbst wird jedoch nicht mehr in der Ausgabe stehen.



Apply-Templates ohne passende Templates

nach obenApply-Templates ohne passende Templates 

So wird auch bei folgendem Beispiel (sample/xslt2.xml) das "undefinierte" Tag b nicht übergeben, der Text nicht fett dargestellt, weil XSLT nicht wissen kann, dass b als Tag so erhalten bleiben soll.

Hallo <b>Welt</b>!



Ein anderes Tag matchen

nach obenEin anderes Tag matchen 

Mit einem zweiten xsl:template-Tag können wir auch beliebige andere Tags bearbeiten - z.B. können wir ein b-Tag kapseln (samples/xslt3.xml und samples/xslt3.xsl)


<xsl:template match="/">
<html>
  <body>
   <xsl:apply-templates/>
  </body>
</html>
</xsl:template>

<xsl:template match="b">
  Fett:<b>
   <xsl:apply-templates/>
  </b> und wieder normal:
</xsl:template>

Achten Sie immer darauf, in der XML-Datei die gewünschte XSL-Datei anzupassen.
Die Navigation im XML-Dokument ist im Artikel Grundkenntnisse geklärt - die dortigen XPath-Anweisungen werden Ihnen bei select- und match- Attributen eine wertvolle Hilfe sein.



xsl:value-of
select

nach obenxsl:value-of 

Neben der schon erwähnten Methode

xsl:apply-updates
kann man den Inhalt eines Tags durchaus auch mit value-of (
xsl:value-of select="..."
) ausgeben. Bei der Ausgabe des aktuellen Taginhaltes in einem Template kann man z.B.
<xsl:value-of select="."/>
verwenden. Der Nachteil: Der Inhalt des Tags wird nicht ausgewertet, sollten also Tags geschachtelt sein
<body> Hallo <b> Welt </b>  </body>
würde man bei einem <xsl:value-of select="/body"/> ein Hallo <b> Welt </b> sehen, auch wenn man an anderer Stelle die Behandlung von b-tags definiert hat.



xsl:value-of
select

nach obenxsl:value-of 

Attribute werden in XSLT grundsätzlich mit tagname/@attributname angesprochen, z.B. img/@src für das src-Attribut eines img-Tags. Mit

<xsl:template match="img">
Bild: <xsl:value-of select="@src"/>
</xsl:template>
kann man dann den Namen eines Bildes ausgeben.



Kurzform einer Ausgabe

nach obenKurzform einer Ausgabe 

Erfolgt die Ausgabe innerhalb von Attributen kann man anstelle eines value-ofs eine geschweifte Klammer verwenden. Siehe xslt4.xsl und xslt4.xml.


<xsl:template match="img">
  <img src="{@src}" alt="{@alt}"/>
</xsl:template>

Ist etwas eleganter als die längere Lösung (Ein kleiner Tipp: Sie könnten gar nicht <img name="<xsl:value-of select="."/>"/> verwenden weil Tags grundsätzlich beendet (nicht geschlossen) sein müssen wenn man eine XSL:value-of-Ausgabe anfängt. Sie müssten mit <xsl:element> arbeiten).



Bedingungen

nach obenBedingungen 

Mit xsl:if können Sie überprfen, ob Variablen, Funktionen, Tags oder Attribute einen bestimmten Wert haben.
Siehe auch when
Ein definiertes Tag oder Attribut hat z.B. immer den Wert true, so gibt

<xsl:if test="@name">
Name des Bildes: <xsl:value-of select="@name"/>
</xsl:if>
Name des Bildes: auch wirklich nur dann aus, wenn auch ein solcher Name definiert wurde.

<xsl:if test="position()!=last()">
<a href="#top"><img src="nachunten.gif"/></a>
</xsl:if>

gibt nur bis zum vorletzen Vorkommen des Tags nachunten-Bilder aus.



das fehlende xsl:else

nach obendas fehlende xsl:else 

Es gibt in XSLT ein else, nur heißt es xsl:otherwise und funktioniert nur in xsl:choose-tags.



case

nach obencase 

xsl:choose ist in etwa mit einem case einer normalen Programmiersprache vergleichbar. Alle when-und otherwise Tags müssen in einem xsl:choose Tag gekapselt sein.


<xsl:choose>
<xsl:when test="state='AZ'">Arizona</xsl:when>
<xsl:when test="state='CA'">Kalifornien</xsl:when>
<xsl:when test="state='DC'">Washington DC</xsl:when>

<xsl:otherwise><xsl:value-of select="state"/></xsl:otherwise>
</xsl:when>

</xsl:choose>



xsl:when

nach obenxsl:when 

Änlich if, darf aber nur in einem choose-Tag vorkommen und ein otherwise (entspricht else) ist möglich. Beispiel siehe xsl:choose



xsl:otherwise

nach obenxsl:otherwise 

Entspricht in etwa else einer Programmiersprache oder einer Default-Einstellung.



xsl:for-each
select

nach obenxsl:for-each 

xsl:for-each ist ein sehr praktisches Tag, weil es erlaubt, alle Tags eines bestimmten Types im aktiven Template auszugeben und zu bearbeiten. Daher ist es z.B. fr Inhaltsverzeichnisse und Stichwortlisten pr�estiniert.

	<xsl:for-each select="//cue">
		<a href="{.}"/><xsl:value-of select="@name"/></a>
 	</xsl:for-each>

findet alle (// entspricht an jeder Position des Dokuments) cues des Dokuments und gibt sie mit Namen aus.
Ein interessanter Nebeneffekt ist, dass es das Element (sofern eins angegeben) in select zum aktiven Knoten macht, im Beispiel wird also jeder //cue nacheinander zum aktiven Element, sodass "." und "@name" die entsprechenden Inhalte haben und nicht wie
	<xsl:for-each select="//cue">
		<a href="{//cue}"/><xsl:value-of select="//cue/@name"/></a>
 	</xsl:for-each>
geschrieben werden mssen - das auch eine ganz andere Bedeutung hätte (select="//cue/@name" würde z.B. wieder den alle Namen-Attribute aller cues ausgeben).
Weil es den aktiven Knoten wechselt, verwenden einige sogar ein xsl:for-each auf ein Statement, das nur ein einziges Element erzeugt, eben um relativ adressieren zu können.



Sortieren
select, *order, *case-order, *lang, *data-type

nach obenSortieren 

xsl:sort ist als Kindelement zu for-each und apply-templates zugelassen. Es sortiert die Ausgabe nach dem in select angegebenem Attribut

	<xsl:for-each select="document(@fname)//cue">
  		<xsl:sort select="@name"/>
  		<xsl:value-of select="@name"/>-<xsl:apply-templates/><br/>
  	</xsl:for-each>
order kann "ascending" oder "descending" sein, case-order "lower-first" oder "upper-first".
lang setze ich gewohnheitsmäßig auf "de", was die deutsche Sortierreihenfolge anwenden sollte, bei Saxon aber nichts ädert. Laut Michael Kay ist die Sortierreihenfolge für modernes deutsch übrigens aäbcdefghijklmnoöpqrstuüvwxyz anstelle - wie zumindest noch in meinem Telefonbuch - ä bei ae einzuordnen. Nebenbei sei die Reihenfolge im Schwedischen ä�nach z.
data-type kann "text", "number" oder ein QName sein was bestimmt ob die Werte dem Alphabet oder Nummern oder einem selbstdefinierten Datentyp zugeordnet werden.
Sortiert xsl:sort nicht die Ausgabe, sondern die Eingabe, also die Reihenfolge in der die Elemente verarbeitet werden. <xsl:sort select="position()" data-type="number" order="descending"/> wendet die Templates in entgegengesetzter Reihenfolge zu der, in der sie im Dokument definiert sind, an.
Eine Sortierung z.B. nach Alter und Name kann durch zwei sorts hintereinander erreicht werden.
  <xsl:for-each select="//person">
    <xsl:sort select="@alter"/>
    <xsl:sort select="@name"/>
    <xsl:value-of select="@alter"/>, <xsl:value-of select="@name"/><br/>
  </xsl:for-each>



das fehlende xsl:while

nach obendas fehlende xsl:while 

Da es in XSLT nicht m�lich ist, Variablen zu modifizieren, gibt es auch kein while, weil sich keine Bedingung jemals ändern könnte. Es ist allerdings möglich, templates rekursiv so aufzurufen, dass sich de facto ein while realisieren lässt.



xsl:variable
name *select

nach obenxsl:variable 

Die Auswertung von select oder der Inhalt wird in der Variable gespeichert. Variablen werden mit $ angesprochen.

<xsl:variable name="lastnode" select="last()"/>
<xsl:if test="position()=$lastnode">
Last node for the turn...
</xsl:if>

<xsl:variable name="decision">
<xsl:if test="position()=1">
First node for the turn...
</xsl:if>
<xsl:if test="position()=last()">
Last node for the turn...
</xsl:if>
</xsl:variable>
Diese Variable hat entweder den Inhalt First node for the turn oder Last node for the turn.

Geltungsbereich:

Werden Variablen innerhalb eines Elements wie template, if, for-each o.ä. definiert, gelten Sie nur innerhalb des Elements und dessen Unterelemente;
<xsl:if test="position()=1">
<xsl:variable name="decision" select="First node for the turn..."/>
</xsl:if>
<xsl:if test="position()=last()">
<xsl:variable name="decision" select="Last node for the turn..."/>
</xsl:if>
erzeugt keine Variable, die ich nach dem letzten </xsl:if> noch ansprechen könnte.



position()

nach obenposition() 

position() gibt die Nummer des aktuell in Bearbeitung befindlichen Templates zurück. Achtung: Diese Nummerierung unterscheidet nicht die Art des Tags, nach einem apply-templates select="*" auf

<hallo>
welt und 
<eintag/>
<eintag/>
</hallo>
wäre Position also 1 bei hallo und 2 bzw. 3 bei eintag So funktioniert's richtig:
   <xsl:template match="//hallo"> 
	<xsl:apply-templates select="*[not(self::eintag)]"/> <!-- not(self::eintag) bedeutet: zuerst einmal alle Tags bearbeiten, die NICHT eintag-tags sind. -->
	<xsl:apply-templates select="eintag"/>  
   </xsl:template> 

   <xsl:template match="eintag"> 
        Position: <xsl:value-of select="position()"/><br/>
	<xsl:value-of select="."/>
   </xsl:template> 



last()

nach obenlast() 

last() gibt die Anzahl der Templates zurück, die anzuwenden sind. Es eignet sich somit hervorragend um in einem xsl:if zusammen mit einem position() zu überprüfen, ob gerade das letzte (vorletzte etc.) Tag einer bestimmten Gattung bearbeitet wird.

<xsl:if test="position()=last()">
Letztes Tag dieser Template-Reihe
</xsl:if>



xsl:number
*count *level *format

nach obenxsl:number 

<xsl:number count="item"> nummeriert die entsprechenden Tags (bei diesem Aufruf: Nummerierung startet bei 1 und zählt jeweils nur die Tags der entsprechenen Verschachtelung - Ergebnisse wie 1,2,1,2,3,4,3,5 sind vorprogrammiert). Das Attribut level="any" anstelle match="item" nummeriert durchgehend durch alle Ebenen - aber auch das ist nicht das was ich unter einer Gliederung verstehe. Diese leistet erst level="multiple" count="item".
Das (optionale) Format-Parameter kann noch viel mehr: format="1.1.1.1" nummeriert nach arabischen Zahlen (Standart)
format="i.1.I.1" nummeriert nach kleinen römischen, dann arabischen, dann großen römischen und dann wieder arabischen Zahlen (bspw:ii.2.IX.9)
Sollten Sie nicht genug Format-Anweisungen gegeben haben (z.B.: i bei einer Schachtelungstiefe von 2) werden die nichtangegebenen Ziffern arabisch (z.B. iii.3.1).
Weitere Beispiele:

c.1 c.1 für das erste, d.1 für das zweite top-level Element
3.1 1.1 für das erste, 2.1 für das zweite top-level Element!
Hier zählt offensichtlich: Wenn eine Zahl gemeint ist fange bei 1 an.
Token Sequenz
01 01,02,03...10,11
andere Unicodes-Nummern entsprechend
a a,b,c..x,y,z,aa,ab...
A A,B,C..X,Y,Z,AA,AB...
i i,ii,iii..ix,x,xi...
I I,II,III..IX,X,XI...
alle nichterkannten Zeichen sind offenbar als Trennzeichen gültig, z.B. - und *. Interessant genug: nichterkannte Zeichen (wie schließende Klammern) am Ende des Format-Strings werden offensichtlich automatisch ans Ende der Ausgabe angefügt, siehe Beispiel-XML und Beispiel-XSL.



document
string

nach obendocument 

Mit document('dateiname.xml') kann man in XPath Tags aus anderen Dateien matchen (für Inhaltsverzeichnisse und Stichwortlisten meist unerlässlich). Das geht überraschend einfach z.B. mit

   <xsl:for-each select="document('xslt6.xml')//hello-world">
   	<xsl:value-of select="."/>
   </xsl:for-each>
Da Dateinamen immer eindeutig sein müssen (sprich: *.xml geht nicht) ist jedoch meistens Projektdateien-anlegen angesagt. In einer Datei project.xml legt man dann z.B. in File-Tags mit den Attributen name alle Dateinamen des Projektes ab, durchforstet sie mit einer foreach-Schleife und inenrhalb dieser Schleife setzt man die Schleife für die eigentlichen Tags an:
  <xsl:for-each select="document('xslt6.xml')//file">
        <xsl:variable name="filename" select="concat(substring-before(@name, '.xml'), '.html')"/> 
        
	<xsl:for-each select="document(@name)">
	
		<a href="{$filename}"/>
  		<xsl:value-of select="//article/@name"/>
  		<br/>  		

  		
  		<xsl:value-of select="//article/@name"/>
  		<br/>  		</xsl:element>

  	</xsl:for-each>
   </xsl:for-each>
Obiges Beispiel geht sogar noch einen Schritt weiter: in der Projekt-Datei werden die Dateinamen natürlich als .XML abgelegt, die concat(substring-before(@name, '.xml'),'.html') - Anweisung sorgt aber dafür, dass der Dateiname abgeschnitten wird und als .html (!) gelinkt wird (hoffen wir, dass diese erzeugt wurden!).
Solche document-aufrufe sind übrigens ein fortgesetztes Ärgernis, weil Sie immer Fehler melden, wenn nicht alle Dateien im Projekt vorhanden und well-formed sind.
Das Beispiel xslt6.xsl (mit xslt6.xml) zeigt ausführlich eine Anwendung (Auflistung von Dateien und aufzählen der enthaltenen Bilder und auflistung der Bilder mit Link auf die entsprechenden Dateien).



xsl:copy

nach obenxsl:copy 

Der Container für xsl:copy-of.

<xsl:template match="a|abbr|acronym|address|b|big|blockquote|br|cite|dfn|div|em|h1|h2|h3|h4|h5|h6|hr|i|kbd|p|pre|q|quote|samp|span|small|strong|sub|sup|tt|var|button|fieldset|form|input|label|legend|option|optgroup|select|caption|col|colgroup|table|tbody|td|tfoot|th|thead|tr|dl|dd|dt|ol|ul|li|img" xmlns:html="http://www.w3.org/1999/XSL/some">
<xsl:copy>
	<xsl:copy-of select="@*"/><!-- alle Attribute und Tags kopieren -->
	<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
kopiert einen Großteil der XHTML 1.1-Tags aus dem Ursprungsdokument in die Ausgabe und wird nebenbei auch für dieses Dokument genutzt (xhtmlxsl.xsl ist in documl.xsl eingebunden).
Außer um Tags in die Ausgabe "durchzuschleifen" kann dieses Tag natürlich auch verwendet werden um einen Abschnitt aus derselben oder einer anderen Quelldatei an die entsprechende Stelle zu kopieren.



xsl:copy-of
select

nach obenxsl:copy-of 

Kopiert Tags. Im Beispiel werden z.B. einige HTML-Tags bei Vorkommen ungeändert und mit allen Attributen in die Ausgabe kopiert.



xsl:import

nach obenxsl:import 

xsl:import importiert ein Style-Sheet. Wichtig ist nur zu beachten, dass es ein top-level-Element ist, also als Kind zu xsl:stylesheet "sehr weit oben" in der Datei stehen muss. xsl:import importiert mit einer niedrigeren Import-Präzedenz als xsl:include, d.h. dass in der lokalen Datei matchende templates den importierten auf jeden Fall vorgezogen werden (anders bei xsl:include).

<xsl:import href="common.xsl"/>
importiert die Style-Sheet-Datei common.xsl.



xsl:include

nach obenxsl:include 

xsl:import importiert ein Style-Sheet als wäre es an dieser Stelle im Quelltext definiert. Es ist wie xsl:import ein top-level-Element.

<xsl:include href="common.xsl"/>
fügt die Style-Sheet-Datei common.xsl an diese Stelle ein. In XSLT-Steuerdateien gilt: first comes first serves, also wird bei zutreffende Templates, sofern doppelt definiert, nur das erste treffende Template angewendet. Sollte also in der Include-Datei ein zutreffendes template definiert sein, wird dieses nur dann nicht angewendet, wenn in der XSLT-Datei vor der xsl:include-Zeile bereits ein treffendes Template angewand wurde.



substring-before()
value, substring

nach obensubstring-before() 

Liefert den Stringteil von value zurück, der VOR Substring steht.



substring-after()
value, substring

nach obensubstring-after() 

Liefert den Stringteil von value zurück, der NACH Substring steht.



concat()
str1, str2

nach obenconcat() 

Liefert einen aus str1 und str2 zusammengesetzten String zurück.



xsl:call-template
name

nach obenxsl:call-template 

Ruft das Template name auf (man beachte die Ähnlichkeit zu einem Funktionsaufruf).

<xsl:template name="mytemplate">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="/">
<xsl:call-template name="mytemplate"/>
</xsl:template>



Eine dateiübergreifende Referenz sortieren

nach obenEine dateiübergreifende Referenz sortieren 

Eine Referenz zu erstellen, ist in XSLT einfach mit einem for-each-Tag möglich; aus verschiedenen Dateien liest man mit document. Normalerweise erstellt man eine XML-Datei in der man alle XML-Dateien erwähnt, die am aktuellen Projekt beteiligt sind:

<project>
<file id="datei1" name="datei1.xml"/>
<file id="datei2" name="datei2.xml"/>
</project>
Diese kann man dann z.B. mit xsl:for-each select="document('project.xml')//file" ansprechen. In diesem Beispiel habe ich jeder Datei noch eine ID gegeben, die in der Datei selbst dann auch irgendwo auftauchen sollte - so spreche ich z.b. in diesem Projekt in project.xml die following-sibling bzw. preceding-siblings des files an, das die gleiche ID hat wie die aktuelle Datei um Links auf die nächste bzw. vorhergehende Datei zu zeigen (in XSLT ist es normalerweise unmöglich, den Dateinamen der aktuelle in bearbeitung-befindlichen-Datei herauszufinden).
Das Problem ist nun das, dass ich in der Schleife, die die Referenzpunkte sortiert, nur die einer XML-Datei ansprechen kann (for-each select="document($documentname)//ref"); <xsl:for-each select="document(document('project.xml')//file/@name)//ref"> geht nämlich NICHT.
Die Lösung ist die, dass man alle //ref's aus allen Dokumenten erst einmal in eine Variable kopieren muss (diese wird damit selbst zum Baum), dann die Variable sortiert und ausgibt. Das gesamte ref-Tag kopieren ist in dem Falle wichtig, weil man schlecht sortieren kann, wenn man nur mit Strings arbeitet und: das ref-Tag enthält oft auch ein Verweisziel, wie einen Dateinamen, der dann an eine andere Stelle kopiert werden würde.
  <xsl:variable name="nodetree">
  <xsl:for-each select="document('project.xml')//file"> 

	<file xmlns="" name="{@name}"> 
	<-- hier wird in der neuen Baumvariable ein Element angelegt das den Dateinamen enthält, in welchem die refs gerade stehen-->
			<xsl:copy-of select="document(@name)//ref"/> 
			<-- hier werden die Ref-tags als Unterelement zum Dateinamen in den Baum kopiert -->
	</file>
   </xsl:for-each>
  </xsl:variable>

  <h2>Nach Stichwort</h2>  	<-- Nach Stichwort sortieren -->

   
  <xsl:for-each select="$nodetree//ref"> <-- alle Refs wieder aus dem Baum raus-->
    <xsl:sort select="@name"/> <-- nach Attribut name sortieren-->
    <a href="{../@name}"><xsl:value-of select="@name"/></a><br/> 
    <-- Und zusammen mit Link auf das Name-Attribut des übergeordneten Elements (File) ausgeben-->
  </xsl:for-each>


  <h2>Nach Datei</h2>  <-- Nach Datei sortieren -->
  <xsl:for-each select="$nodetree//file"> 
  <xsl:sort select="@name"/>
	<xsl:for-each select="//ref"> 
	  <xsl:sort select="@name"/> <-- Jeden Dateiinhalt nach Stichwort sortieren -->
	    <a href="{../@name}#{../@a}"><xsl:value-of select="@name"/></a><br/><-- ... und ausgeben -->
    	</xsl:for-each>
  </xsl:for-each>



Die in diesem Projekt verwendete Transformation ist nochmal ein bisschen schwerer weil die Links genauer sein sollten und auf jeden Absatz zielen - das heißt letztendlich, dass ich ich die Sections (s-tags) in den Sortierbaum aufnehmen musste...
Zum debuggen empfehle ich übrigens mit copy-of select="$baumvariable" die Variable erstmal in den HTML-Quelltext zu kopieren um dann dort zu sehen ob sie funktioniert.



What's missing

nach obenWhat's missing 

Es trifft nicht ganz zu, diesen Artikel "für Profis" genannt zu haben; Das XSLT ein bisschen mehr ist, als hier erwähnt wurde, "wäre ungefähr wie zu sagen, die Haut eines Ertrinkenden sei feucht. Es ist richtig aber es trifft nicht den Kern der Sache" (Scott Adams). XSLT ist ein weitaus mächtigeres Werkzeug als ich bei meinen ersten Style-Sheets gedacht habe - hoffentlich können Sie mit diesen Dateien schonmal anfangen, Ihre ersten Style-Sheets zu schreiben und vielleicht springt der Funke über...



Grundlegender Aufbau

nach obenGrundlegender Aufbau 

DTDs sind in SGML definiert, aber nicht in XML. Überwiegend werden <!-Tags verwendet, Elemente mit !ELEMENT, Attribute mit !ATTLIST elementname (in einer XML- Umgebung wäre es logischer, die Attribute als Tags in den Element-Tag zu schreiben) und Entities mit !ENTITY definiert.



Einbindung

nach obenEinbindung 

DTDs werden in die XML-Datei eingebuden mit

<!DOCTYPE ROOTELEMENT SYSTEM "DTDDATEINAME.dtd">



PCDATA

nach obenPCDATA 

Tags können als Inhalt entweder weitere Tags und/oder Buchstaben haben (z.B. <p> hallo Welt </p>). Diese Buchstaben werden in DTDs entweder als CDATA (character data, für Attribute) oder als
PCDATA (parsed character data) definiert.



Elemente

nach obenElemente 

Tags (entsprechen Elementen) werden mit dem Schlüsselwort <!ELEMENT tagname> definiert.

---myfirst.dtd
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Schaden tut der XML-Header nicht-->
<!ELEMENT hello-world (#PCDATA)>
---myfirst.xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<?xml-stylesheet href="myfirst.xsl" type="text/xsl"?> 
<!DOCTYPE hello-world SYSTEM "myfirst.dtd">
<hello-world>
Hallo Welt!
</hello-world>
Beachten Sie die neue Zeile !DOCTYPE und die absolute Pfadangabe des DTDs: hier sind keine relativen Pfade möglich.



leere Tags und volle Tags

nach obenleere Tags und volle Tags 

Das Schlüsselwort EMPTY definiert Tags, die keinen Inhalt haben dürfen (wie etwa das br/-Tag in HTML)

<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT hello-world EMPTY>
dahingehen definiert ANY, dass jedes Tag in diesem Tag vorkommen darf.



Tags erlauben

nach obenTags erlauben 

Innerhalb der Klammern nach dem Tagnamen können Sie allerdings auch eine Liste mit Tags angeben, die vorkommen sollen oder müssen. Das Beispiel verlangt im Tag hello-world nach genau einem Vorkommen des Tags name, das Text enthalten kann.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT hello-world (name)>
<!ELEMENT name (#PCDATA)>
Weitere Tags werden mit Kommata getrennt
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT hello-world (name, alter)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT alter (#PCDATA)>
Um die Anzahl anzugeben, in der Tags vorkommen dürfen, benutzt man die Zeichen
* für keinmal, einmal oder öfter
+ für mindestens einmal oder öfter
? für keinmal oder einmal
(element1 | element2) für Element1 ODER Element2
Beispiel in DTD.DTD bzw. DTD.XML . Sie sehen dort auch, dass Sie die Reihenfolge der Tags einhalten müssen.
PCDATA können Sie in die Tags auch einbringen; um zu versuchen, dies
<p>Dies ist <u>ein</u> 
<i>Text mit <u>Unterstrich</u></i></p> 
in einem DTD "legal zu machen", folgt
1) Muss P mit PCDATA, i oder u zu füllen sein
2) Muss i mit PCDATA oder u zu füllen sein und
3) Muss u mit PCDATA oder i zu füllen sein
daraus folgt
<!ELEMENT p (#PCDATA | i | u)*>
<!ELEMENT i (#PCDATA | u)*>
<!ELEMENT u (#PCDATA | i)*>
Da PCDATA | Sektionen laut Internet Explorer ("Mixed content model must be defined as zero or more('*'). ") gesternt werden müssen, erklärt sich der * in der ersten Zeile.
Dieser würde normalerweise das Verwenden von mehreren Top-Level-P-Tags ermöglichen, da das dann jedoch kein XML mehr wäre ( höchstens ein Top-Level-Tag) ergeben sich Schwierigkeiten wenn man's versucht.
Beachten Sie auch dass Sie im Doctype der XML-Datei das neue Top-Level-Tag angeben müssen: <!DOCTYPE p SYSTEM "dtd2.dtd">
Der Einfachheit halber habe ich das Beispiel unter Samples/dtd2.dtd bzw. Samples/dtd2.xml abgelegt.



Attribute

nach obenAttribute 

Attribute werden mit !ATTLIST definiert - so

<!ATTLIST p
name	CDATA	#REQUIRED
beschreibung	CDATA	#IMPLIED
autor	CDATA	"ich"
groesse	(klein|mittel|gross)	#IMPLIED
intoc (ja|nein)	"ja"
>
wobei
#REQUIRED bedeutet, dass das Attribut vom XML-Schreiber angegeben werden muss
"" den Defaultwert des Attributs angint und
(a|b|c) bedeutet, dass das Modul den Wert a oder b oder c haben muss.
Da Atributnamen in einem Tag nur einmal benutzt werden dürfen, entfällt der ganze Kram mit "mindestens einmal" und ?*+.
Um den Spaß vorwegzunehmen habe ich auch ein Projekt gespeichert, dass sowohl aus DTD als auch aus XML- und XSLT-Datei besteht. Die Ausgabe zeigt sehr schön, dass die Default-Attributwerte auch tatsächlich so interpretiert werden (autor und intoc wurden ja nicht in der XML-Datei definiert).



Entities

nach obenEntities 

Zwei Beispiele:

<!ENTITY myente "quaak">
<!ENTITY auml "ä">
Während der Aufruf von &myente; in der XML-Datei quaak erzeugt &auml; ein ä.
Eine Weitergabe der Entity als
<!ENTITY auml "&auml;">
kommt übrigens aus zwei Gründen nicht in Frage:
Erstens kennt XML (nur XHTML!) gar kein &auml; sondern nur Unicode-Entities und
zweitens wäre das "infinite entity reference loop"
(drittens arbeiten wir sowieso im 8859-1-Zeichensatz und gebrauchen keine Entities für Umlaute ;))



Was weggelassen wurde

nach obenWas weggelassen wurde 

Nicht erwähnt habe ich Parameter Entity References (Entities die in der DTD genutzt werden können und damit eine gewisse Modularisierung erlauben - oft benutzte Zeichenketten kann man als Parameter Entity zentralisieren), bedingte Abschnitte in der DTD und Notationen. Mit Parameter Entity References kann man auch andere DTDs in den eigenen DTD importiert.



Warum Schemata

nach obenWarum Schemata 

Anders als DTDs werden Schemata in einem XML-Format definiert. Das ist an und für sich schonmal ein Vorteil, dazu kommt aber dass das u.A. so ist weil Schemata erst 2001 vom W3C verabschiedet worden sind und es deshalb erheblich mehr Werkzeuge gibt die auf Konformität mit einem DTD prüfen und Schemata noch nicht interpretieren. Ich persönlich nutze Schemata nur dort, wo ich deren Vorteil brauche und der ist: Daten und nicht Dokumentorientiert zu arbeiten.
Es gibt in Schemata verschiedene Datentypen, in DTDs gibt es diese nicht. Ich kann also sagen ein Tag darf nur ein Datum enthalten, bei DTDs muss ich damit leben dass die XML-Autoren in ein Feld namens Datum 1999, 1.10.1999, erster Oktober 1999 oder Mickey Mouse hat einen Bruder reinschreibt. Werden die XMLs automatisch verarbeitet, z.B. in eine Datenbank eingetragen wird das entsprechende Programm spätestens beim Mickey-Mouse-Satz seine helle Freude haben.



Einbindung

nach obenEinbindung 

Schemata werden in die XML-Datei eingebunden mit

<ROOTELEMENT xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SCHEMADATEINAME.xsd">

...

</ROOTELEMENT>



Tags

nach obenTags 

Tags werden mit dem xsd:element-Tag beschrieben. Ein sehr einfaches Schema wäre z.B.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified">
	<xsd:element name="p" type="xsd:string"/>
</xsd:schema>
Ein leeres Root-Tag habe ich in der Praxis übrigens noch nie gesehen...
Der Typ ist übrigens mein XML-Lieblingstag: erstaunlich leicht zu programmieren lässt sich nämlich ein eigener Typ:



Untertags

nach obenUntertags 

mit

	<xsd:complexType name="wasbeliebt">
		<xsd:sequence>
			<xsd:element name="b" type="xsd:string"/>
			<xsd:element name="i" type="xsd:string"/>
  			<xsd:element name="u" type="xsd:string"/>
  		</xsd:sequence>
	</xsd:complexType>
definieren Sie den Typ "wasbeliebt", den Sie in p mit
	<xsd:element name="p" type="wasbeliebt"/>
einbinden. Er verpflichtet Sie zu einen b, einem i und einem u-Tag mit jeweils einem String als Inhalt.



Inline Schemata

nach obenInline Schemata 

Man kann die complexTypes übrigens auch gleich ins Element einbetten:

	<xsd:element name="p">
	<xsd:complexType name="wasbeliebt">
			<xsd:element name="i" type="xsd:string"/>
	</xsd:complexType>
	</xsd:element>
Wobei sich der complexType zwar mit einem Namen bezeichnen, aer nicht mehr ausserhalb des element-Tags als type="wasbeliebt" angeben lässt. Dass sicht kein element-type definieren UND gleichzeitig ein complexType einbetten lässt sollte sich von selbst verstehen.



Tags zur Auswahl stellen

nach obenTags zur Auswahl stellen 

Wenn Sie den DTD-Teil dieses Tutorials schon gelesen haben, wissen Sie aber, dass das nicht Sinn der Sache war. Es sollen beliebig viele und geschachtelte i us und bs möglich sein. Ein xsd:choice sieht zwar wie eine Lösung aus, ist aber keine

	<xsd:complexType name="wasbeliebt">
		<xsd:choice>
			<xsd:element name="b" type="xsd:string"/>
			<xsd:element name="i" type="xsd:string"/>
  			<xsd:element name="u" type="xsd:string"/>
  		</xsd:choice>
	</xsd:complexType>
weil es nur ein Tag erlaubt - immerhin kann das jetzt ENTWEDER b, u oder p sein. Die Lösung liegt in den Attributen:



minOccurs

nach obenminOccurs 

minOccurs und maxOccurs liegen in engem Wettstreit mit type um meine persönlichen XML-Lieblingsattribute. Während Type eine beinahe schon an PHP erinnernde intuitive (weil logische) Programmierung erlaubt sind minOccurs und maxOccurs in vielen Tags erlaubt und -- bedeuten immer das Gleiche (keine Ausnahmen, kein fehlersuchen, kein Referenzenwühlen).
minOccurs="n" bedeutet: Das in dem Tag spezifizierte Element muss mindestens n-mal vorkommen.



maxOccurs

nach obenmaxOccurs 

maxOccurs="n" verhält sich analog: Das in dem Tag spezifizierte Element darf höchstens n-mal vorkommen. Wobei jede Zahl für eine Zahl steht und "unbounded" für unendlich. Mit diesen beiden Elementen lässt sich dann auch unser ibu (italic/bold/underline)-Beispiel weiter bringen: durch ein ergänzen einer Zeile erhält man nämlich

		<xsd:choice minOccurs="0" maxOccurs="unbounded">
... die Möglichkeit, die Sequenz dreimal hintereinander zu schreiben. An sich hätte man auch die Möglichkeit, das minOccurs und maxOccurs hinter die einzelnen Elemente zu schreiben, etwa
	<xsd:element name="b" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
	<xsd:element name="i" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
	<xsd:element name="u" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
so, (diese 3 Zeilen würden übrigens auch in einer Sequenz das gewünschte Ergebnis bringen). Genaugenommen besteht ein ziemlich komplizierter Unterschied der sich ungefähr so erklären lässt: Entweder, man macht beliebig viele Choices die entweder aus i, b oder u bestehen oder man macht eine Choice die aus beliebig vielen i, bs und us besteht.
minOccurs="0" und maxOccurs="0" bei jedem Element machen die Sequenz übrigens de-facto zu einem Choice, das Problem ist, wenn die Sequenz nicht eingehalten wird (z.B. ein u vor einem b kommt), wird das Stylesheet invalid wenn nicht auch die Sequenz selbst als minOccurs="0" und maxOccurs="0" definiert wurde (denn dann könnte eine Sequenzdie nur aus u besteht vor einer Sequenz, die nur aus b besteht, existieren).
Lange Rede kurzer Sinn: obwohl es noch mindestens zwei andere Arten gibt definiert
	<xsd:element name="p" type="wasbeliebt"/>
	<xsd:complexType name="wasbeliebt">
		<xsd:choice minOccurs="0" maxOccurs="unbounded">
			<xsd:element name="b" type="xsd:string"/>
			<xsd:element name="i" type="xsd:string"/>
			<xsd:element name="u" type="xsd:string"/>
		</xsd:choice>
	</xsd:complexType>

die Sache. Basta.



Tags in beliebiger Reihenfolge erlauben

nach obenTags in beliebiger Reihenfolge erlauben 

Leichter als in DTDs kann man in Schemata Tags erlauben und von der Reihenfolge absehen: wie xsd:sequence und xsd:choice wird xsd:all definiert.

	<xsd:element name="p" type="wasbeliebt"/>
	<xsd:complexType name="wasbeliebt">
		<xsd:all>
			<xsd:element name="b" type="xsd:string"/>
			<xsd:element name="i" type="xsd:string"/>
			<xsd:element name="u" type="xsd:string"/>
		</xsd:all>
	</xsd:complexType>

Es arbeitet wie eine Sequence unabhängig von der Reihenfolge, mit jeweils maximal einem Auftreten eines Tags.



Attribute

nach obenAttribute 

Attribute werden in einem complexType mit xsd:attribute definiert (und dürfen im complexType immer erst NACH choices oder sequences definiert werden).

	<xsd:element name="p" type="wasbeliebt"/>
	<xsd:complexType name="wasbeliebt">
		<xsd:attribute name="ibu" type="xsd:string"/>
	</xsd:complexType>
oder
	<xsd:element name="p" type="wasbeliebt"/>
	<xsd:complexType name="wasbeliebt">
		<xsd:choice minOccurs="0" maxOccurs="unbounded">
			<xsd:element name="b" type="xsd:string"/>
			<xsd:element name="i" type="xsd:string"/>
			<xsd:element name="u" type="xsd:string"/>
		</xsd:choice>
		<xsd:attribute name="ibu" type="xsd:string"/>
	</xsd:complexType>
(als schema2.xml bzw. schema2.xsd) Da haben wir übrigens den Dokumenttyp, der nur das Top-Level-Tag beinhalten darf.
Mit dem Attribut use können Sie übrigens angeben ob das entsprechende Attribut definiert werden muss. Unterschieden wird zwischen "required" (muss angegeben sein), "optional" (kann angegeben sein), "default" (kann angegeben sein) und "prohibited" (darf nicht angegeben sein, was darauf hindeutet, dass in Schemata irgendwo ein "if" definiert sein muss). Ein min/maxOccurs verbietet sich deshalb, weil Attribute ja sowieso nur höchstens einmal den gleichen Namen haben dürfen.
default-Werte für Attribute gibt es in Schemas auch, soweit ich das verstanden habe werden sie mit use="default" und einem weiteren Attribut, value="Wert" gebildet. Das habe ich auch in schema3.xsd angedeutet und mit XMLSpy validieren lassen, aber mein Saxon 6.2.2 scheint es nicht auszuwerten. Genausowenig wie default-Werte für Tags nebenbei, die mit dem Attribut "default="Defaultwert"" möglich sein sollten.



Attributaufzählungen

nach obenAttributaufzählungen 

Sie können wie in DTDs die Auswahlmöglichkeiten bei einem Attribut gezwungenermaßen einschränken -- und zwar durch verwenden eines simpleTypes mit einer restriction:

		<xsd:attribute name="bio" use="required">
            	<xsd:simpleType>
                	<xsd:restriction base="xsd:string">
                    		<xsd:enumeration value="clear"/>
                    		<xsd:enumeration value="investigating"/>
                    		<xsd:enumeration value="suspicious"/>
                	</xsd:restriction>
            	</xsd:simpleType>
	        </xsd:attribute> 
Wie man sieht ist "base" der Datentyp, der eingeschränkt werden soll.



Wertebereich einschränken

nach obenWertebereich einschränken 

angenommen wir möchten zu p noch ein Attribut, Note. Diese Note soll eine ganze Zahl im Bereich von 1-6 sein (in der Schweiz von 6-1 ;)). Wir machen auch das mit einer restriction, geben aber ein minInclusive und ein maxInclusive vor.

<xsd:simpleType name="notentyp">
    <xsd:restriction base="xsd:integer">
        <xsd:minInclusive value="1"/>
        <xsd:maxInclusive value="6"/>
    </xsd:restriction>
</xsd:simpleType>



Datentypen

nach obenDatentypen 

Von Hause aus bieten Schemas die folgenden Datentypen:

Name Beispiele Erklärung
String "Hallo Welt" Zeichenkette
boolean {true, false} entweder true oder false
decimal 42.9 Kommazahl
float 42.9, -12.4, 44, 2.03E5, 0, -0, INF, -INF, NAN INF=Unendlich, -INF=minus Unendlich, NAN=Not A Number, keine Zahl
duration P2Y5M4DT5H17M33.4S Anzahl Jahre, Anzahl Monate, Anzahl Tage, Trenner zwischen Datum und Zeit ("T"), Stunden, Minuten und Sekunden
dateTime 2001-06-08T18-46-02 Jahre, Monate, Tage, Trenner zwischen Datum und Zeit ("T"), Stunden, Minuten und Sekunden
time 19:12:00.03 Stunden,Minuten,Sekunden.Hundertstel
date 2001-06-08 Jahr-Monat-Tag
gYearMonth 2001-06 Jahre, Monate
gYear 2001 Jahre
gMonthDay 12-12 Monat, Tag
gDay 12 Tag
gMonth 5 Monat
hexBinary 12EAB0 Ein hexadezimaler Wert
anyURI http://www.usegroup.de/ Eine URI
Abgeleitete Datentypen
integer 12 Ganzzahlen
positiveInteger 12 positive Ganzzahlen
negativeInteger -12 Ganzzahlen kleiner Null
long 122 -9223372036854775808 bis 9223372036854775808
64-Bit Integer
int 122 -2147483648 bis 2147483647
32-Bit Integer
byte 122 -127 bis 128 8-Bit Integer



Eigene Datentypen definieren

nach obenEigene Datentypen definieren 

Mit

	<xsd:element name="plz" type="plz"/>	
	...
	<xsd:simpleType name="plz">
    		<xsd:restriction base="xsd:integer">
        <xsd:length value="5"/>
können Sie angeblich (XMLSpy interpretier offensichtlich falsch) den Taginhalt auf 5 Zahlen beschränken, spätestens bei dem Versuch, eine Telefonnummer mit Vorwahl zu verlangen, muss ich mangels Testumgebung aufgeben. Versuchen wollte ich
    <xsd:restriction base="xsd:integer">
      <xsd:pattern value="\d{5}\/d{5}"/>
    </xsd:restriction>
für ein Pattern aus 5 digits, einem /, den man bei regulären Ausdrücken mit dem \ maskiert (\/) und dann nochmals 5 digits. Genaugenommen ist das eher ein Beispiel für schlechte reguläre Ausdrücke; denn vierstellige Vorwahlen sollten im heutigen Handyzeitalter möglich sein und die Länge der Nummer auf keinen Fall nur 5 betragen dürfen.



Entities

nach obenEntities 

"Since XML Schema begins work on the infoset of a well-formed (perhaps valid) XML document, parsed entity definition substitution has already taken place. We decided a two-pass architecture was too clunky, and arguably impossible, and concluded the best thing was to leave XML 1.0 entities to XML 1.0 mechanisms (i.e. you can define entities in the internal subset) ", Henry S. Thompson.
Auf Deutsch: Da Schemata nur auf XML-Dateien anzuwenden sind, die schon well-formed sind, muss jeder sehen wo er bleibt.
Zum Beispiel hier:

<!DOCTYPE ROOTELEMENT [
<!ENTITY eacute "é">
]>
in jeder XML-Datei macht zwar keinen Spaß, funktioniert aber. Dahingegen muss ich leider zugeben, dass ich das W3C-Beispiel für Entityähnliche Elemente nicht zum laufen bekommen habe:
We can achieve a similar but not identical outcome by declaring an element in a schema, and by setting the element's content appropriately: 

<xsd:element name="eacute" type="xsd:token" fixed="é"/>

And this element can be used in an instance document: 

Using an element instead of an entity in an instance document. 
<?xml version="1.0" ?>
<purchaseOrder xmlns="http://www.example.com/PO1"
               xmlns:c="http://www.example.com/characterElements"
               orderDate="1999-10-20>
 <!-- etc. --> 
  <city>Montr<c:eacute/>al</city>
 <!-- etc. -->
</purchaseOrder>



Unicode

nach obenUnicode 

Für eigene XML-Formate, die dann noch per XMLT umgewandelt werden, kann es wichtig sein, Umlaute einzubinden. In XHTML stehen zwar Entities wie &auml; zur Verfügung, Unicode funktioniert allerdings unabhängig davon immer auch in eigenen Formaten.

Hier einige wichtige deutsche Unicodes:

Ä 00c4 &#196; ä 00e4 &#228;
Ü 00dc &#220; ü 00fc &#252;
Ö 00d6 &#214; ö 00f6 &#246;
ß 00df &#223; & 0026 &#0038;



Lizenz

nach obenLizenz 

GNU Free Documentation License

Version 1.1, March 2000

Copyright (C) 2000  Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.



0. PREAMBLE

nach oben0. PREAMBLE 

0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other written document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.



1. APPLICABILITY AND DEFINITIONS

nach oben1. APPLICABILITY AND DEFINITIONS 

1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you".

A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License.

The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License.

A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.



2. VERBATIM COPYING

nach oben2. VERBATIM COPYING 

2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may publicly display copies.



3. COPYING IN QUANTITY

nach oben3. COPYING IN QUANTITY 

3. COPYING IN QUANTITY

If you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.



4. MODIFICATIONS

nach oben4. MODIFICATIONS 

4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.



5. COMBINING DOCUMENTS

nach oben5. COMBINING DOCUMENTS 

5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements."



6. COLLECTIONS OF DOCUMENTS

nach oben6. COLLECTIONS OF DOCUMENTS 

6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.



7. AGGREGATION WITH INDEPENDENT WORKS

nach oben7. AGGREGATION WITH INDEPENDENT WORKS 

7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate.



8. TRANSLATION

nach oben8. TRANSLATION 

8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail.



9. TERMINATION

nach oben9. TERMINATION 

9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.



10. FUTURE REVISIONS OF THIS LICENSE

nach oben10. FUTURE REVISIONS OF THIS LICENSE 

10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.



Kurzreferenz

nach obenKurzreferenz 

Nach Stichwort

!ATTLIST

!DOCTYPE

!ELEMENT

!ENTITY

<!-- -->

ancestor::

article

articleinfo

Attribute ansprechen

Bilder, DocBook/XML

br-Tag, in DocBook

child::

concat()

corpauthor

date

descendant::

Docbook

document()

emphasis

following-sibling::

footnote

Fußnoten, DocBook/XML

imagedata

imageobject

inlinemediaobject

Kommentare

Kursiv, DocBook/XML

Kurzform einer Ausgabe

last()

Links, DocBook/XML

maxOccurs

minOccurs

parent::

PCDATA

PDF, export aus DocBook

position()

preceding-sibling::

Schemata inline

self::

subject

subjectset

subjectterm

substring-after()

substring-before()

title

ulink

Unicode

XML:FO

xsd:all

xsd:attribute

xsd:choice

xsd:complexType

xsd:complexType

xsd:element

xsd:enumeration

xsd:maxInclusive

xsd:minInclusive

xsd:restriction

xsd:sequence

xsd:simpleType

xsd:simpleType

xsl:apply-templates

xsl:apply-templates

xsl:call-template

xsl:case, siehe xsl:choose

xsl:choose

xsl:copy

xsl:copy-of

xsl:else, das fehlende

xsl:for-each

xsl:if

xsl:import

xsl:include

xsl:number

xsl:otherwise

xsl:sort

xsl:template

xsl:text

xsl:value-of

xsl:variable

xsl:when

xsl:while, das fehlende

{}

Nach Datei

docbook.html

article

articleinfo

Bilder, DocBook/XML

br-Tag, in DocBook

corpauthor

date

Docbook

emphasis

footnote

Fußnoten, DocBook/XML

imagedata

imageobject

inlinemediaobject

Kursiv, DocBook/XML

Links, DocBook/XML

PDF, export aus DocBook

subject

subjectset

subjectterm

title

ulink

XML:FO

dtds.html

!ATTLIST

!DOCTYPE

!ELEMENT

!ENTITY

PCDATA

einstieg.html

<!-- -->

Attribute ansprechen

Kommentare

Kurzform einer Ausgabe

xsl:apply-templates

xsl:apply-templates

xsl:template

xsl:text

xsl:value-of

{}

entities.html

Unicode

fortgeschrittene.html

xsl:case, siehe xsl:choose

xsl:choose

xsl:else, das fehlende

xsl:for-each

xsl:if

xsl:otherwise

xsl:sort

xsl:variable

xsl:when

xsl:while, das fehlende

fuer-profis.html

concat()

document()

last()

position()

substring-after()

substring-before()

xsl:call-template

xsl:copy

xsl:copy-of

xsl:import

xsl:include

xsl:number

grundkenntnisse.html

ancestor::

child::

descendant::

following-sibling::

parent::

preceding-sibling::

self::

schema.html

maxOccurs

minOccurs

Schemata inline

xsd:all

xsd:attribute

xsd:choice

xsd:complexType

xsd:complexType

xsd:element

xsd:enumeration

xsd:maxInclusive

xsd:minInclusive

xsd:restriction

xsd:sequence

xsd:simpleType

xsd:simpleType



copyright (c)2003-2005   useGroup



copyright (c)2003-2005   useGroup