- 1 Intro
- 2 Anwendungsgebiete
- 2.1 XSLT - die Programmiersprache im XML Bereich
- 2.2 Aktuelle und vergangene Anwendungen
- 2.3 Professionelle XML Verarbeitung
- 2.4 Technische Dokumentation
- 3 Wichtige Konzepte
- 3.1 Push vs. Pull Stylesheets
- 3.2 Eindeutigkeit der Regelbasis
- 3.3 Namespaces
- 3.4 Schemata
- 3.5 Standards
- 3.5.1 DITA
- 3.5.2 DITA Inhaltsmodell
- 3.5.1 DITA
- 4 Ausgewählte Themen
- 4.1 Transformationen mit XSLT
- 4.1.1 Vortransformationen
- 4.1.2 Komplexe XML-2-XML Transformationen
- 4.1.2.8 Vererbung
- 4.1.2.8 Vererbung
- 4.1.3 XSLT Streaming
- 4.1.3.1 XSLT Akkumulator
- 4.1.3.2 XSLT Iterator
- 4.1.4 Reguläre Ausdrücke
- 4.1.5 Modus vs. Tunnel Lösung
- 4.1.6 Identifikation mit
generate-id()
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.7 Webservice Calls mit doc() und unparsed-text()
- 4.1.8 Stylesheet-Parameter auf der Kommandozeile
- 4.1.9 Leerzeichenbehandlung
- 4.1.10 Mit
translate
Zeichen ersetzen
- 4.1.10.1 Spass mit dem Sequenzvergleich
- 4.1.11 Character Mappings in der Ausgabe
- 4.1.12 JSON mit XSLT 1.0 und Python lxml
- 4.1.1 Vortransformationen
- 4.2 Abfragen mit XQuery
- 4.2.5 XQuery als Programmiersprache
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.5.3.2 SQL Views in MarkLogic
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.6 Hilfreiche XQuery Schippsel
- 4.2.5 XQuery als Programmiersprache
- 4.3 XML Datenbanken
- 4.3.1 Connector zu Marklogic in Oxygen
- 4.3.2 Bi-Temporale Dokumente
- 4.3.2.1 Anlegen des Testszenarios auf der ML Konsole
- 4.3.2.2 Ausführen einiger Beispiel-Queries
- 4.3.3 Webapps mit MarkLogic
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.4 Dokument-Rechte in MarkLogic
- 4.3.5 MarkLogic Tools
- 4.3.5.1 EXPath Konsole
- 4.3.5.2 mlcp - MarkLogic Content Pump
- 4.3.5.3 Deployment-Tools
- 4.4 XSL-FO mit XSLT1.x
- 4.5 Testing
- 4.5.1 Validierung mit Schematron
- 4.5.2 Erste Schritte mit XSpec
- 4.5.1 Validierung mit Schematron
- 4.6 Performanz-Optimierung
- 4.1 Transformationen mit XSLT
- 5 Zusätzliches Know-How
- 5.1 XML Editoren
- 5.2 Quellcode-Versionskontrolle
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.2.2 GIT Kommandos
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.1 XML Editoren
- 6 Glossary
- 7 Tektur CCMS
4.1.10 Mit translate Zeichen ersetzen
Die
fn:translate()
XPath Funktion gibt es schon seit XSLT1.0. Mit den moderneren Varianten, wie
fn:replace()
die auch ERROR! Linktarget does not exist verstehen, gibt es aber für die meisten Anwendungsfälle mächtigere Alternativen.
Jedoch kann man mit
translate
mehrere Zeichen auf einmal ersetzen. Mit
replace
müsste man dagegen die Funktionen verschachteln, so wie in diesem Beispiel:
<xsl:function name="dy:make-url"> <xsl:param name="root"/> <xsl:value-of select="replace(replace(replace(replace($url-pattern, '%id%', $root/@id), '%version%',$root/@version), '%language%',$root/@language), '%variant%',$root/@variant)"/> </xsl:function>
Priscilla Walmsley bietet aber auch eine Funktion, die mehrere Replacements vornehmen kann ↗.
Das Ersetzen von Einzel-Zeichen macht man am besten mit
fn:translate()
.
In der Indexsortierung des Buchindex wurden in XSLT1.0 Stylesheets die Gruppentitel der Indexrubriken mittels dieser Funktion normalisiert. Um bspw. die Zeichen
AÄÅaäå
(beachte das schwedische Bolle-A ↗ auf den Gruppentitel
A
abzubilden, würde folgender
translate
-Aufruf genügen:
<xsl:value-of select="translate(.,'AÄÅaäå','A')/>
Das große
A
wäre nun der Gruppentitel für unsere Zeichen. Natürlich will man nicht jedes Zeichen einzeln mappen, sondern eine globale Regel für das ganze Alphabet angeben. Das könnte bspw. für die französischen Kleinbuchstaben so aussehen:
<xsl:variable name="kleinbuchstaben" select="'abcdefghijklmnopqrstuvwxyzÀàÆæÇçÉéÈèÊêËëÎîÏïÖöÔôŒœÙùÜüÛûŸÿ'/> <xsl:variable name="gruppentitel" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZAAAACCEEEEEEEEIIIIOOOOOOUUUUUUYY'/> <xsl:value-of select="translate(.,$kleinbuchstaben,$gruppentitel)"/>
Hier kommt es auf die Reihenfolge der Zeichenketten an. Ausserdem müssen die Strings gleich lang sein.
Solche Zeichenketten schreibt man am besten in eine sprachabhängige separate XML Datei, die auch ausserhalb des Quelltexts gepflegt werden könnte.
Auch die Prüfung, ob ein Wort mittels Leerzeichen im Satz abgesetzt ist, lässt sich mittels
fn:translate
realisieren. Hier wird sicherlich auch eine Prüfung notwendig sein, die prüft, ob eine Zeichenkette schon mit einem Leerzeichen (unter Ausschluss von Interpunktionszeichen) beginnt:
test="not(starts-with(replace( replace(.,$common-punctuation-marks,''),$whitespaces,' '),' '))"
mit dieser Variablenbelegung:
<sch:let name="common-punctuation-marks" value="'.,!?()[]{}"`":;⟨⟩©–—-+…=«»¿<>"%‰®™|/'"/> <sch:let name="whitespaces" value="'          '"/>
Dem Einsatzbereich von
fn:translate()
ist mit genügend Lösungsphantasie keine Grenzen gesetzt.