Hallo,
Ich bastele mir grad in PHP ein XML-Dokument. Das klappt recht gut, bis auf eine Sache: Sonderzeichen verhindern die Darstellung des XML-Dokuments. Da hab ich mir gedacht, ich nehme htmlentities() und maskiere die Inhalte halt so. Aus ß wird so halt ß.
Das XML-Dokument wird damit korrekt erstellt. Im nächsten Schritt wird mit XSL ein HTML-Dokument erstellt und dieses verschluckt das ß bzw. ß ist nicht mehr da. "Sofortmaßnahmen" wird also zu "Sofortmanahmen".
Nun werdet ihr sagen: "Du brauchst eine Encodierung". Die Sache ist, ich hab die ja angegeben beim Erstellen des neuen XML-Dokuments mit DOM.
Ich gehe wie folgt vor:
// Creates an instance of the DOMImplementation class
$imp = new DOMImplementation;
// Creates a DOMDocumentType instance
$dtd = $imp->createDocumentType('article', '', 'sdocbook.dtd');
// Creates a DOMDocument instance
$dom = $imp->createDocument("", "", $dtd);
// Set encoding
$dom->encoding = 'iso-8859-1';
// Create an the root element
$article = $dom->createElement('article');
// Set an Attribute for root element
$article->setAttribute('lang', 'de');
// Append the root element
$dom->appendChild($article);
// Create Title Element
$title = $dom->createElement('title', 'Sofortmaßnahmen');
$article->appendChild($title);
// Create SubTitle Element
$subtitle = $dom->createElement('subtitle', 'Untertitel');
$article->$dom->appendChild($subtitle);
//Output created XML
echo $dom->saveXML();
Ja, und die Ausgabe sollte so aussehen, wegen dem "ß" in Sofortmaßnahmen meckert DOM jedoch rum und macht ab dem Zeichen nicht mehr weiter.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article SYSTEM "sdocbook.dtd">
<article lang="de">
<title>Sofortmaßnahmen</title>
<subtitle>Untertitel</subtitle>
</article>
In der DTD sind alle Sonderzeichen als Entities angegeben, so dass sie eigentlich akzeptiert werden sollten.
Das XSL zur Weitervearbeitung und Anzeige des XML als HTML ist ebenso in iso-8859-1. Stellt aber diese htmlentities-Darstellung der Sonderzeichen nicht da. Warum? Wieso werden die übergangen?
Als Zwischenschritt mach ich nun folgendes:
$myxml = $dom->saveXML();
$myxml = html_entity_decode($myxml);
$xml = new DOMDocument();
$xml->resolveExternals = true;
$xml->loadXML($myxml);
echo $xml->saveXML();
Damit werden die dekodierten HTMLEntities wieder in gewöhnliche Sonderzeichen umgewandelt und im Browser nach erfolgter XSL-Transformation korrekt angezeigt.
Gruß,
Leeloo
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra