Ich füge nun nochmals einen Beitrag in diesem Thread hinzu um das Thema weitestgehend abzuschließen. Dabei möchte ich euch aber nicht nur eine Antwort "hinknallen", sondern auch etwas genauer darauf eingehen wie ich zur Lösung kam.
1]
Ist mein XSL-Sheet besser geformt als das vom W3C vorgeschlagene?
A: Grundsätzlich ja, obwohl ich es nocheinmal geändert habe. Das aktuelle Sheet sieht aus wie folgt...
Zitat:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:transform>
|
Farblich markierte Änderungen sind von mir hinzugefügt worden.

Meine XML Dateien enthalten allesamt eine valide DTD mit selbst generierter .DTD-Datei. Nur damit das auch gesagt ist.
2]
Wie funktioniert der Workaround des W3C eigentlich, d.h. warum binden die das Sheet vor der DTD Angabe ein?
A: Um diese Frage zu beantworten ist neben ein Grundkenntnissen in XML auch ein Verständniss des IE6/7 Browsers erforderlich.
Im XSL Sheet wird grundsätzlich nur eine Ersetzung durchgeführt.
Die XSL-Datei sollte mit <xsl:template match="/"> beginnen. Diese Anweisung enthält die Angaben, was der Browser machen soll, wenn das Element
/ aufgerufen wird. Das spezielle Zeichen "/" bezeichnet hier das Root-Element der XML-Datei, das auf jeden Fall aufgerufen wird. Dort beschreibt man dann erstmal den Aufbau der Seite.
Der Befehl "xsl:copy-of" kopiert Tags, bzw. eigentl. Knoten in XML-Dateien. Man könnte auch sagen, es fügt Teilstrukturen and Ergebnisstrukturfragmente in die Ergebnisstruktur ein.
Letztlich hat dies vereinfacht gesagt zur Folge, dass der Browser gezwungen wird alle HTML inhalte die im Ursprungsdokument vorhanden sind nun durch den XML Parser der Internet Explorers geschickt werden (Ja den gibt es!). Kurzum: Das HTML Dokument wird als application/xml geparst und nicht als text/html.
3]
Wie kann ich das Dokument korrekt ausliefern ohne PHP-DTD-Selectionsscript?
A: Aehm... garnicht!
Selbst mit dem Workaround des W3C ist eis einfach unvereinbar/unmöglich verschiedene DTD's für verschiedene Dokumente, zur Anzeige unter letztlich verschiedenen Browsern und deren jeweils speziellen Anforderungen, auszuliefern.
Letztlich bleibt nur die Möglichkeit auf ein Script wie das Folgende zurückzugreifen.
Zitat:
<?php
/* vim : set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/* np++: set tab-size=4 replace-with-spaces=no file-type-detection=auto */
/**
* Short description for file
* <left behind>
* Long description for file (if any)...
* <left behind>
* PHP versions 4 and 5
* @category CategoryName
* @package PackageName
* @author Original Author <info@tron-delta.org>
* @author Another Author <team@tron-delta.org>
* @copyright 2007 TRON-DELTA.ORG
* @license http://tron-delta.org/license/<foo>
* @version TurtoiseSVN
* @link http://tron-delta.org/downloads/package/<foo>
* @see NetOther, W3C Workaround, Switch
* @since File available since Release 1.0.0
* @deprecated File deprecated in Release 2.0.0
**/
$charset = "UTF-8";
$mime = "text/html";
function fix_code($buffer) {
return (preg_replace("!\s*/>!", ">", $buffer));
}
if(stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml")) {
if(preg_match("/application\/xhtml\+xml;q=([01]|0\.\d{1,3}|1\.0)/i",$_SERVER["HTTP_ACCEPT"],$matches)) {
$xhtml_q = $matches[1];
if(preg_match("/text\/html;q=q=([01]|0\.\d{1,3}|1\.0)/i",$_SERVER["HTTP_ACCEPT"],$matches)) {
$html_q = $matches[1];
if((float)$xhtml_q >= (float)$html_q) {
$mime = "application/xhtml+xml";
}
}
}
else {
$mime = "application/xhtml+xml";
}
}
if(($mime == "application/xhtml+xml") AND ($enforce == "on")) {
$prolog_type = "<?xml version=\"1.0\" encoding=\"$charset\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\n\t\t\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\">\n";
}
if(($mime == "application/xhtml+xml") AND ($enforce == "off")) {
$prolog_type = "<?xml version=\"1.0\" encoding=\"$charset\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n\t\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\n";
}
if ($mime == "text/html") {
// ob_start("fix_code");
$prolog_type = "<?xml version=\"1.0\" encoding=\"$charset\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"dtd.xsl\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\n";
}
header("Content-Type: $mime;charset=$charset");
header("Vary: Accept");
print $prolog_type;
?>
|
Die HTML-Datei, welche obriges PHP-Script aufruft enthält nur noch folgendes anstelle des DTD-Definitionsteils:
Zitat:
<?php
$enforce = "on";
include("./database/d@ta/script/php/dtd.php");
?>
|
Dabei steuert
enforce mit dem switch on/off ob XHTML 1.1 oder doch nur 1.0 Strict verwendet wird. Den HTML 4.01 Teil habe ich abgeschaltet, da ich ihn selbst für den IE für nutzlos erachte. Dementsprechend ist auch die Funktion
fix_code nichtig. - Sie wird einfach nicht aufgerufen. Der Rest sollte im Grunde selbsterklärend sein.
Was bleibt sonst noch zu sagen....?
Achja ein Ausdruck meiner .htaccess und ein Hinweis auf das META meines Portals.
Viel Spaß!
PS: Ich weiß dass die htaccess 'ne Baustelle ist.