XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XSL-T / Die XSLT - Struktur / xsl:character-map / 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">&#</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>0</zeichen></z>
<z><nr>49</nr><zeichen>1</zeichen></z>
<z><nr>50</nr><zeichen>2</zeichen></z>
<z><nr>51</nr><zeichen>3</zeichen></z>
<z><nr>52</nr><zeichen>4</zeichen></z>
<z><nr>53</nr><zeichen>5</zeichen></z>
<z><nr>54</nr><zeichen>6</zeichen></z>
<z><nr>55</nr><zeichen>7</zeichen></z>
<z><nr>56</nr><zeichen>8</zeichen></z>
<z><nr>57</nr><zeichen>9</zeichen></z>
</root>
Das Ergebnis sieht im Browser so aus:
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="&#{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">&#</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">&#</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="&#{format-number(., '00000')};">
<xsl:text disable-output-escaping="yes">&#</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.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de