Mit Zeichenkarten schwierige Serialisierungsprobleme lösen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie brauchen eine exakte Kontrolle der Serialisierung Ihres Dokuments. Die XSLT 1.0-Funktion disable-output-escaping ist dabei für Ihren Bedarf zu eingeschränkt.

Lösung

XSLT 2.0 bietet eine neue Eigenschaft namens Zeichenkarte (Character Map), die eine exakte Kontrolle der Serialisierung ermöglicht. Eine Zeichenkarte ist für den Gebrauch mit der Anweisung xsl:output gedacht.

Die Anweisung xsl:character-map nimmt die folgenden Attribute entgegen:

name

Definiert den Namen der Zeichenkarte.

use-character-maps

Eine Liste weiterer Zeichenkarten, die in diese aufgenommen werden sollen.

 

Der Inhalt von xsl:character-map ist eine Folge von xsl:output-character-Elementen. Diese Elemente definieren eine Zuordnung zwischen einem einzelnen Unicode-Zeichen und einem String, der anstelle des Zeichens ausgegeben werden soll, wenn dieses Zeichen serialisiert wird. Die folgende Karte kann verwendet werden, um verschiedene Sonderzeichen als Entities auszugeben:

<xsl:character-map name="spaces">
  <xsl:output-character char="&#xA0;" string=" "/>
  <xsl:output-character char="&#x2003;" string="&emsp;"/>
  <xsl:output-character char="&#x2007;" string="&numsp;"/>
  <xsl:output-character char="&#x2008;" string="&puncsp;"/>
  <xsl:output-character char="&#x2009;" string="&thincsp;"/>
  <xsl:output-character char="&#x200A;" string="&hairsp;"/>
</xsl:character-map>

Eine andere, raffiniertere Anwendung von Zeichenkarten ist die Ausgabe von Nichtstandarddokumenten, die schwierig wäre, weil sie die Regeln von XML oder XSLT verletzen. Michael Kay liefert in seinem Buch XSLT Programmer's Reference (3rd Edition), ein Beispiel für das Ausgeben von Elementen, die auskommentiert sind. Hier ist eine Variation seines Beispiels. Der Grundgedanke besteht darin, eine Kopie des Eingabedokuments zu generieren, bei der jedoch der Inhalt bestimmter Elemente mit XML-Kommentaren auskommentiert ist:

<?xml version="1.0"?>
<!-- Definieren eigener Entities mit Hilfe der Unicode-Zeichen für den privaten Gebrauch -->
<!DOCTYPE xsl:stylesheet [
  <!ENTITY start-comment "&#xE501;">
  <!ENTITY end-comment "&#xE502;">
]>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Importieren der Transformation -->
  <xsl:import href="copy.xslt"/>
  <!-- Dem Serialisierer mitteilen, dass er unsere unten definierte Zeichenkarte verwenden soll -->
  <xsl:output use-character-maps="comment-delimiters"/>
  <!-- Definieren eines Schlüssels, der verwendet wird, um Elemente zu identifizieren, die auskommentiert werden sollen. -->
  <xsl:key name="omit-key" match="omit" use="@id"/>
  <!-- Abbilden unserer eigenen Entities auf Strings, die die Syntax der XML-Start- und -Endkommentare formen -->
  <xsl:character-map name="comment-delimiters">
    <xsl:output-character character="&start-comment;" string="&lt;!--"/>
    <xsl:output-character character="&end-comment;" string="--&gt;"/>
  </xsl:character-map>
  <!-- Auskommentieren solcher Elemente, die ein id-Attribut besitzen, das der id eines omit-Elements aus dem externen Dokument omit.xml entspricht. -->
  <xsl:template match="*[key('omit-key',@id,doc('omit.xml'))]">
    <xsl:text>&start-comment;</xsl:text>
    <xsl:copy>
      <xsl:apply select="@* | *"/>
    </xsl:copy>
    <xsl:text>&end-comment;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

Siehe auch

Evan Lenz entwickelte einen XML-zu-String-Konverter, der einen alternativen Ansatz für den Umgang mit schwierigen Serialisierungsproblemen bietet.

  

<< 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