Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XSL-T / Die XSLT - Struktur / xsl:character-map / Liste der Sonderzeichen selbst erstellen

Liste der Sonderzeichen selbst erstellen

Liste der Sonderzeichen selbst erstellen

➪ Was ich in der Praxis oft benötige, ist ein schneller Überblick, hinter welcher Codenummer sich welches Zeichen verbirgt.

Statt sich durch endlose Dokumentationen zu quälen (ohne deren Relevanz infrage zu stellen), bevorzuge ich, mir eine Liste aller Zeichen durch ein Programm generieren zu lassen.

Ein solches Programm, das eine Anzahl Codenummern in eine HTML- bzw. XML-Datei schreibt, die anschließend in einem Browser angezeigt werden kann, ist auch mit XSLT 2.0 problemlos möglich.

Den einfachsten Ansatz liefert das folgende Codebeispiel:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
   <xsl:result-document href="C:/wg/zeichensaetze.xml">
    <root>
     <xsl:for-each select="48 to 57">
      <z>
       <nr>
        <xsl:value-of select="."/>
       </nr>
       <zeichen>
        <xsl:text 
             disable-output-escaping="yes">&amp;#</xsl:text>
        <xsl:value-of select="fn:concat(., ';')"/>
       </zeichen>
      </z>
     </xsl:for-each>
    </root>
   </xsl:result-document>
  </xsl:template>
</xsl:stylesheet>

Die vorstehende Logik kann mit einem beliebigen XML-Input-Dokument einfach aufgerufen werden, lediglich ein XSL-2.0-fähiger Prozessor ist erforderlich. Das Ergebnis ist ein Überblick über die Codepoints 49 bis 57, die die Zahlenwerte von 0 bis 9 darstellen.


<root>
  <z><nr>48</nr><zeichen>&#48;</zeichen></z>
  <z><nr>49</nr><zeichen>&#49;</zeichen></z>
  <z><nr>50</nr><zeichen>&#50;</zeichen></z>
  <z><nr>51</nr><zeichen>&#51;</zeichen></z>
  <z><nr>52</nr><zeichen>&#52;</zeichen></z>
  <z><nr>53</nr><zeichen>&#53;</zeichen></z>
  <z><nr>54</nr><zeichen>&#54;</zeichen></z>
  <z><nr>55</nr><zeichen>&#55;</zeichen></z>
  <z><nr>56</nr><zeichen>&#56;</zeichen></z>
  <z><nr>57</nr><zeichen>&#57;</zeichen></z>
</root>

Das Ergebnis sieht im Browser so aus:

pic/codepoints.jpg

Es ist damit ein Leichtes, alle Zeichen von angenommen 33 bis 50000 darzustellen (es gibt noch weit mehr), Sie müssen hierfür lediglich die Sequenz anpassen:


<xsl:for-each select="33 to 50000">
...
</xsl:for-each>

Wundern Sie sich jedoch bitte nicht, wenn das Ergebnisdokument etwas umfangreicher wird, sodass Ihr verwendeter Browser etwas Zeit braucht, um alle Zeichen darzustellen.

Das vorstehende Template arbeitet mit


<xsl:text disable-output-escaping="yes">&#</xsl:text>

Einen alternativen Ansatz bietet die spezielle String-Funktion codepoints-to-string:


 <xsl:template name="LoopZeichensaetze">
  <root xmlns="www.wilfried-grupe.de/Zeichensaetze.xsl">
   <xsl:for-each select="32 to 55294">
    <zeichen nr="&amp;#{format-number(., '00000')};">
     <xsl:value-of select="codepoints-to-string(.)"/>
    </zeichen>
   </xsl:for-each>
  </root>
 </xsl:template>

Wenn Sie es etwas komplexer mögen: Das Template "Zeichensaetze_HTML" generiert eine solche Liste für HTML. Bitte beachten Sie, dass die unterschiedlichen Browser diverse Zeichen unterschiedlich darstellen. Hinzu kommt, dass diverse Zeichen nicht dargestellt werden können.


<xsl:template name="Zeichensaetze_HTML">
 <xsl:result-document
  href="Zeichensaetze.html"
  method="html">
  <html>
   <head>
    <meta http-equiv="Content-Type" 
     content="text/html; charset=utf-8" />
   </head>
   <body>
    <h3>Zeichensätze</h3>
    <table border="1" width="100%">
     <xsl:for-each select="(40 to 55294)[. mod 10 = 0 ]">
      <tr>
       <xsl:variable name="vcurnumber" select="."/>
       <xsl:for-each select="-9 to 0">
        <xsl:variable name="vpos" select="."/>
        <td align="right">
         <xsl:text disable-output-escaping="no">&amp;#</xsl:text>
         <xsl:value-of 
           select="format-number($vcurnumber + $vpos, '00000')" />
         <xsl:text>;</xsl:text>
        </td>
        <td align="center" bgcolor="lightgrey">
         <xsl:text disable-output-escaping="yes">&amp;#</xsl:text>
         <xsl:value-of 
           select="format-number($vcurnumber + $vpos, '00000')" />
         <xsl:text>;</xsl:text>
        </td>
       </xsl:for-each>
      </tr>
     </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:result-document>
</xsl:template>

Das zweite Template generiert gleich eine ganze Reihe einzelner XML-Dateien mit unterschiedlichen ISO-8859-Encodings; für jedes werden die Zeichen von 32 bis 55294 generiert. Ich habe diesen Ansatz gewählt, um festzustellen, ob und inwieweit die Browser die Zeichen unterschiedlich darstellen.


 <xsl:template name="iso8859">
  <xsl:for-each select="1 to 9, 11, 13, 15">
   <xsl:variable name="vdateiname">
    <xsl:value-of
       select="concat('Zeichensaetze_iso8859_', ., '.xml')" />
   </xsl:variable>
   <xsl:variable name="vencoding">
    <xsl:value-of select="concat('iso-8859-', .)"></xsl:value-of>
   </xsl:variable>
   <xsl:result-document href="{$vdateiname}"
    encoding="{$vencoding}" indent="yes" 
    method="xml" omit-xml-declaration="no">
     <root xmlns="www.wilfried-grupe.de/Zeichensaetze.xsl">
      <xsl:for-each select="32 to 55294">
       <zeichen nr="&amp;#{format-number(., '00000')};">
       <xsl:text disable-output-escaping="yes">&amp;#</xsl:text>
        <xsl:value-of select="format-number(., '00000')" />
        <xsl:text>;</xsl:text>
       </zeichen>
      </xsl:for-each>
     </root>
   </xsl:result-document>
   <xsl:message>geschrieben: 
     <xsl:value-of select="$vdateiname"/></xsl:message>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

Das dritte Template versucht denselben Ansatz für UTF8 und UTF16. Dieses Template arbeitet mit der oben beschriebenen LoopZeichensaetze.


<xsl:template name="generateutf">
  <xsl:result-document
   href="Zeichensaetze_utf8.xml"
   encoding="UTF-8" indent="yes" 
   method="xml" omit-xml-declaration="no">
   <xsl:call-template name="LoopZeichensaetze" />
  </xsl:result-document>
  <xsl:message>geschrieben: 
    Zeichensaetze_utf8.xml</xsl:message>
  <xsl:result-document
   href="Zeichensaetze_utf16.xml"
   encoding="UTF-16" indent="yes" 
    method="xml" omit-xml-declaration="no">
   <xsl:call-template name="LoopZeichensaetze" />
  </xsl:result-document>
  <xsl:message>geschrieben: 
   Zeichensaetze_utf16.xml
</xsl:message>
 </xsl:template>
</xsl:stylesheet>

wg / 4. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/Encoding1.html