Schreibweisen konvertieren

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen einen großgeschriebenen String in Kleinbuchstaben konvertieren oder umgekehrt.

Lösung

XSLT 1.0

Verwenden Sie die XSLT-Funktion translate( ). Dieser Code beispielsweise wandelt von Groß- in Kleinbuchstaben um:

translate($input, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')

Dieses Beispiel wandelt von Klein- in Großbuchstaben um:

translate($input, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')

XSLT 2.0

Verwenden Sie die XPath 2.0-Funktionen upper-case( ) und lower-case( ):

upper-case($input)
lower-case($input)

Diskussion

Dieses Rezept ist natürlich trivial. Ich habe es dennoch aufgenommen, um die Nachteile der XSLT 1.0-Lösung zu diskutieren. Die Schreibweisenkonvertierung ist trivial, solange Ihr Text sich auf eine einzige Lokalisierung beschränkt. Im Englischen müssen Sie sich kaum – falls überhaupt – mit Sonderzeichen, die Akzente enthalten, oder mit anderen komplizierten Umwandlungen herumschlagen, in denen ein einziges Zeichen in zwei Zeichen konvertiert werden muss. Das beste Beispiel ist die deutsche Sprache, in der das kleingeschriebene ß in ein großgeschriebenes SS umgewandelt wird. Die meisten modernen Programmiersprachen bieten Funktionen zur Schreibweisenumwandlung, die die Lokalisierung beachten. XSLT jedoch unterstützt dieses Konzept nicht direkt. Das ist bedauerlich, vor allem angesichts der Tatsache, dass XSLT andere Eigenschaften aufweist, die eine Internationalisierung unterstützen.

Eine leichte Verbesserung kann vorgenommen werden, indem für jede Textkonvertierung allgemeine XML-Entitys definiert werden, wie das folgende Beispiel zeigt:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stylesheet [ 
  <!ENTITY UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ"> 
  <!ENTITY LOWERCASE "abcdefghijklmnopqrstuvwxyz"> 
  <!ENTITY UPPER_TO_LOWER " '&UPPERCASE;' , '&LOWERCASE;' "> 
  <!ENTITY LOWER_TO_UPPER " '&LOWERCASE;' , '&UPPERCASE;' "> 
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>     
  <xsl:template match="/">
    <xsl:variable name="test" select=" 'The rain in Spain falls mainly on the plain' "/>
    <output>
      <lowercase>
        <xsl:value-of select="translate($test,&UPPER_TO_LOWER;)"/>
      </lowercase>
      <uppercase>
        <xsl:value-of select="translate($test,&LOWER_TO_UPPER;)"/>
      </uppercase>
    </output>
  </xsl:template>      
</xsl:stylesheet>

Diese Entity-Definitionen erreichen drei Dinge. Erstens erleichtern sie es, das Stylesheet in eine andere Lokalisierung zu portieren, da nur die Definitionen der Entities UPPERCASE und LOWERCASE geändert werden müssen. Zweitens machen sie den Code kompakter, da nun nicht mehr alle Buchstaben des Alphabets zweimal aufgelistet werden müssen. Drittens machen sie jemandem, der den Code überprüft, die Absicht des translate-Aufrufs deutlich. Puristen könnten sich über das Verschwinden des dritten Parameters von translate( ) beschweren, ich jedoch mag die Art und Weise, wie sich der Code dann liest. Falls Sie lieber auf der Seite der reinen Lehre herumirren wollen, verwenden Sie translate($test, &UPPERCASE;, &LOWERCASE;).

Ich habe die Verwendung von Entities noch nicht sehr häufig in anderen XSLT-Büchern gesehen; allerdings glaube ich, die Technik hat einen Vorteil. Um genau zu sein, besteht der Vorteil von XSLT, das in XML-Syntax geschrieben wurde, darin, dass Sie alle Eigenschaften von XML ausschöpfen können, und die Entity-Definition ist gewiss eine nützliche Eigenschaft. Falls Sie vorhaben, diese Technik zu verwenden, und planen, mehr als nur ein paar Stylesheets zu schreiben, sollten Sie darüber nachdenken, die gebräuchlichen Entity-Definitionen in eine externe Datei zu setzen und sie, wie im Beispeil Standard.ent gezeigt, einzufügen. Sie können diese Werte auch in globalen Variablen in einem externen Stylesheet speichern und sie bei Bedarf importieren. Diese Alternative wird von vielen XSLT-Veteranen bevorzugt.

Beispiel: Standard.ent

<!ENTITY UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ">
<!ENTITY LOWERCASE "abcdefghijklmnopqrstuvwxyz">
<!ENTITY UPPER_TO_LOWER " '&UPPERCASE;' , '&LOWERCASE;' ">
<!ENTITY LOWER_TO_UPPER " '&LOWERCASE;' , '&UPPERCASE;' ">
<!-- andere ... --> 

Verwenden Sie dann ein Parameter-Entity, das in Hinblick auf die externe Datei standard.ent definiert wird, wie im folgenden Beispiel zu sehen ist.

Beispiel: Ein Stylesheet, das standard.ent verwendet.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE stylesheet [ 
  <!ENTITY % standard SYSTEM "standard.ent">
  %standard;
]>
<xsl:stylesheet version="1.0"
  <!-- ... --> 
</xsl:stylesheet> 

Steve Balls Implementierung der Schreibweisenkonvertierung funktioniert in praktisch allen Fällen, indem die gebräuchlichsten Unicode-Zeichen in die Kleinbuchstaben- und Großbuchstabenstrings eingefügt werden und das deutsche ß gesondert behandelt wird.

XSLT 2.0

Die neuen XPath 2.0-Funktionen upper-case( ) und lower-case( ) lösen die meisten der Probleme mit der Schreibweisenkonvertierung, die in nicht-englischen Alphabeten auftreten können. Eine Ausnahme bilden Unicode-Konvertierungen, die die Lokalisierung beachten. Es ist am besten, wenn Sie diese Funktionen nicht für Vergleiche einsetzen, bei denen die Groß- und Kleinschreibung nicht beachtet wird. Setzen Sie stattdessen compare( ) mit einer Sortierreihenfolge ein, die die Schreibweise ignoriert.

Siehe auch

Steve Balls Lösung steht in der »XSLT Standard Library« zur Verfügung.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de