XSL-Quelltext für HTML-Transformation

Das unten aufgeführte XSLT-Stylesheet wird aktiv,

In jedem Fall erfolgt die Transformation im Client durch Microsofts MSXML3-Engine.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!--==================================================================
*                (c) Heinz Werner Kramski / DLA Marbach
*=====================================================================
*       $Source: H:\\projekte\\kessler\\XML\\dtd\\RCS/hgkdiary-html.xsl $
*           $Id: hgkdiary-html.xsl 1.10 2001/03/28 12:26:27 kramski Exp kramski $
*        Aufruf: <?xml-stylesheet href="hgkdiary.xsl" type="text/xsl"?>
*     Parameter: keine
*         Zweck: XSL-Stylesheet fuer HGK-Quelltexte
*      Umgebung: XML, MSXML 3, IE5+
*    Siehe auch: hgkdiary.dtd, hgkdiary[-html].css
*   Bemerkungen:
*
*   MSXML3 Beta 7/2000 unterstuetzt erstmals den W3C-XSLT-Standard
*   (xmlns:xsl="http://www.w3.org/1999/XSL/Transform") und die vielen
*   damit verbundenen nuetzlichen Features (<xsl:text> u.ae.). Beim
*   Betrieb des IE5 als Stand-alone-XML-Browser wird so ein Stylesheet
*   jedoch nicht interpretiert. Dies klappt nur, wenn es nach alter MS
*   Konvention als <? ... xmlns:xsl="http://www.w3.org/TR/WD-xsl"?>
*   desklariert ist. Abbhilfe ist moeglich: MSXML3.DLL muss im
*   "replace mode" installiert werden, dann wird es auch bei "alten"
*   Anwendungen aktiv. Dazu einmalig  %WINDIR%\system\xmlinst.exe
*   ausfuehren!
*
*   Beim Aufruf per Script (z.B. aus XM2) sind beide Formen moeglich.
*
*   Beim Aufruf per Script mit TransformNode(...) entsteht immer
*   UTF-16-kodierter Ausgabestrom, im Ergebnis werden dabei alle
*   Sonderzeichen verstuemmelt (auf ihren Grundbuchstaben reduziert,
*   etwa "&agr;" zu "a").
*
*   Beim Aufruf per Script mit TransformNodeToObject(...) kann die
*   Ausgabekodierung mit <xsl:output> definiert werden, dafuer muss
*   aber die Ausgabedatei wohlgeformt sein, was Klimmzuege erfordert.
*
*   Geeignete Ausgabekodierung ist UTF-8. Ich habe keine Moeglichkeit
*   gefunden, auch in der Ausgabedatei Character-Entities zu verwenden.
*
*   XSLT scheint das Eingabedokument immer als UTF-8 zu sehen, d.h.
*   normale Zeichen sind mit 8 Bit, Sonderzeichen als 16-Bit Unicode
*   kodiert. Dies ist offenbar unabhaengig davon, ob die Zeichen
*   in der Eingabedatei binaer, als benannte Entities oder als
*   numerische Entities vorlagen.
*
*   ToDo: Whitespace ist u.U. noch problematisch, kontrollieren!
*         Wie soll man HTML-Tags ohne Ende-Tags behandeln (z.B. <image>)?
*
*=====================================================================
*   $Log: hgkdiary-html.xsl $
*   Revision 1.10  2001/03/28 12:26:27  kramski
*   Behandlung von Abbildungen (provisorisch)
*
*   Revision 1.9  2001/03/27 13:05:50  kramski
*   Fehlerkorrektur: Dokument wurde doppelt ausgegeben
*
*   Revision 1.8  2001/03/27 10:16:07  Administrator
*   Dokumentation ergaenzt
*
*   Revision 1.7  2001/03/27 00:12:34  Administrator
*   TransformNodeToObject() ausgetrickst (validiert jetzt)
*
*   Revision 1.6  2001/03/26 23:16:50  Administrator
*   Temp. Anpassungen an TransformNodeToObject():
*   keine <head> nehr, um unpaariges <META> (das von MSXML generiert wird!)
*   zu vermeiden.
*   <link> ebenfalls unpaarig und entfernt.
*
*   Revision 1.5  2000/09/08 13:00:55  kramski
*   Fehlerkorrektur: <rs type="aaa.bbb"> wird nun korrekt zu
*   <a class="aaa-bbb">
*
*   Revision 1.4  2000/08/15 23:43:33  kramski
*   Unterstreichung
*
*   Revision 1.3  2000/08/15 21:22:07  kramski
*   Diverse Verfeinerungen
*
*   Revision 1.2  2000/08/14 21:50:54  kramski
*   erste funktionierende Version (MSXML3 Beta 7/2000 in replace mode),
*   IE5 als Stand-alone-Browser
*
*   Revision 1.1  2000/08/12 19:29:59  kramski
*   Initial revision
*
*===================================================================-->

<xsl:output method="html" version="4.0" encoding="UTF-8" indent="no"/>

<!-- Root-Template -->
<xsl:template match="/">
   <html>
   <xsl:comment> Generiert durch $Id: hgkdiary-html.xsl 1.10 2001/03/28 12:26:27 kramski Exp kramski $.</xsl:comment>
   <head>
   <!--
        MSXML generiert unmittelbar nach diesem <head> ein
           <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
        (natuerlich) ohne schliessendes Tag. Damit entsteht aber nicht-wohlgeformtes
        XML, und wenn dieses Stylesheet per Script und transformNodeToObject()
        aufgerufen wird, so schlaegt die Transformation fehl und die Zieldatei bleibt leer.
        (Statischer Einbindung als Stylesheet funktioniert.)
        Wir erzeugen deshalb hier ein schliessendes </META>:
   -->
   <xsl:text disable-output-escaping="yes"></META></xsl:text>
   <!-- Hier muessen wir ebenfalls tricksen: -->
   <xsl:text disable-output-escaping="yes"><link rel="stylesheet" type="text/css" href="../../dtd/hgkdiary-html.css"></xsl:text>
   <xsl:text disable-output-escaping="yes"></link></xsl:text>
   <script language="javascript"><![CDATA[
      function DBQuery(RecordID)
      {
         // Hier koennte sonstwas passieren, vorlaeufig:
         alert("Starte Datenbankabfrage für \"" + RecordID + "\" ...\n\n...Noch nicht implementiert, schade!");
      }
   ]]></script>
   <title>
      <xsl:value-of select="//titleStmt/title"/>
   </title>
   </head>
   <body>
      <xsl:apply-templates/>
   </body>
   </html>
</xsl:template>


<!-- Default-Template: alles gelb, was kein spezielles Template hat -->
<xsl:template match="*">
   <span style="background-color: yellow">
      <xsl:attribute name="title"><xsl:value-of select="name(.)"/></xsl:attribute>
      <xsl:apply-templates/>
   </span>
</xsl:template>


<!-- Echte Templates -->
<xsl:template match="TEI.2">
   <xsl:apply-templates/>
</xsl:template>


<!-- TEI-Header -->
<xsl:template match="teiHeader">
   <span>
   <xsl:attribute name="class">teiHeader</xsl:attribute>
   <xsl:apply-templates/>
   </span>
</xsl:template>


<xsl:template match="fileDesc">
   <span>
   <xsl:attribute name="class">fileDesc</xsl:attribute>
   <h1><xsl:value-of select="titleStmt/title"/></h1>
   <p><xsl:value-of select="publicationStmt/p"/>
   <xsl:value-of select="sourceDesc/p"/></p>
   </span>
</xsl:template>


<xsl:template match="revisionDesc">
   <span>
   <xsl:attribute name="class">revisionDesc</xsl:attribute>
   <ul><xsl:apply-templates/></ul>
   </span>
</xsl:template>


<xsl:template match="change">
   <li><xsl:value-of select="."/></li>
</xsl:template>


<!-- Text etc. -->
<xsl:template match="text">
   <span>
   <xsl:attribute name="class">text</xsl:attribute>
   <xsl:apply-templates/>
   </span>
</xsl:template>


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


<xsl:template match="div[@type='month']">
   <div>
   <xsl:attribute name="class">month</xsl:attribute>
   <xsl:apply-templates/>
   </div>
</xsl:template>


<xsl:template match="div[@type='month']/head">
   <h2>[<xsl:apply-templates/>]</h2>
</xsl:template>


<xsl:template match="div[@type='entry']">
   <div>
   <xsl:attribute name="class">entry</xsl:attribute>
   <xsl:apply-templates/>
   </div>
</xsl:template>


<xsl:template match="div[@type='entry']/head">
   <h3>[<xsl:apply-templates/>]</h3>

</xsl:template>


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


<xsl:template match="dateline">
   <h4><xsl:apply-templates/></h4>
</xsl:template>


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


<xsl:template match="note">
   <span>
   <xsl:if test="@type">
      <xsl:attribute name="class">note-<xsl:value-of select="translate(@type, '.', '-')"/></xsl:attribute>
      <xsl:attribute name="title">note-<xsl:value-of select="translate(@type, '.', '-')"/></xsl:attribute>
   </xsl:if>
   [<xsl:apply-templates/>]
   </span>
</xsl:template>


<xsl:template match="seg">
   <span>
   <xsl:if test="@type">
      <xsl:attribute name="class">seg-<xsl:value-of select="translate(@type, '.', '-')"/></xsl:attribute>
      <xsl:attribute name="title"><xsl:value-of select="@type"/></xsl:attribute>
   </xsl:if>
   <xsl:apply-templates/>
   </span>
</xsl:template>


<xsl:template match="hi">
   <span>
   <xsl:if test="@rend">
      <xsl:attribute name="class"><xsl:value-of select="translate(@rend, '.', '-')"/></xsl:attribute>
   </xsl:if>
   <xsl:apply-templates/>
   </span>
</xsl:template>


<xsl:template match="figure">
   <image>
   <xsl:if test="@n">
      <xsl:attribute name="alt"><xsl:value-of select="@n"/></xsl:attribute>
   </xsl:if>
   <xsl:if test="@entity">
      <!-- vorlaufig, spaeter "richtig" auswerten (aber wie?) -->
      <xsl:attribute name="src">../../images/preview/<xsl:value-of select="@entity"/>.jpg</xsl:attribute>
   </xsl:if>
   <xsl:if test="@rend">
      <xsl:attribute name="align"><xsl:value-of select="@rend"/></xsl:attribute>
   </xsl:if>
   </image>
</xsl:template>


<!-- Namen -->
<xsl:template match="rs[@type] | name[@type]"><a>
   <!-- type= in class= umsetzen -->
   <xsl:attribute name="class"><xsl:value-of select="translate(@type, '.', '-')"/></xsl:attribute>
   <xsl:attribute name="title"><xsl:value-of select="translate(@type, '.', '-')"/></xsl:attribute>
   <!-- aus key= ein href= basteln -->
   <xsl:if test="@key">
      <xsl:attribute name="href">javascript:DBQuery('<xsl:value-of select="@key"/>')</xsl:attribute>
      <xsl:attribute name="title"><xsl:value-of select="translate(@type, '.', '-')"/>, key=<xsl:value-of select="@key"/></xsl:attribute>
   </xsl:if>
   <xsl:value-of select='.'/></a></xsl:template>


<!-- einfacher Text ohne Tags -->
<xsl:template match="text()">
   <xsl:value-of select="."/>
</xsl:template>


</xsl:stylesheet>