Hi Leute.
Ich habe ein sehr amüsantes Problem, das ich mir nicht erklären kann. Ich fummle privat gerade mit
DOM-
XML und PHP (4.3.4) herum. Funktioniert alles sehr gut, weil das eigentliche Parsing ja vom XSL-Stylesheet übernommen wird. Soll heißen: wer das Ding richtig programiert, benötigt streng genommen nur 4 Anweisungen, um ein
XML-Dokument anzeigen zu lassen.
Wie gesagt: grundsätzlich funktioniert alles. Nun will ich aber einen Fehlerfall abfangen, nämlich den, dass das Dokument nicht existiert
Code:
index.php?product=gibtsnicht.xml
DOM stellt eine Funktion zur Verfügung, mit der man ein temporäres Dokument im Speicher und gleich an die Variable übergeben kann:
Code:
$xmldoc = domxml_open_mem(
"<?
xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n".
"<?
xml-stylesheet href=\"../product.xsl\" type=\"text/xsl\"?>\n".
"<!DOCTYPE product SYSTEM \"../product.dtd\">\n".
"<product type=\"doku\" sig=\"doku/fehler\" name=\"Fehler\">\n".
[color=#ff0000]" <uppernavigation href=\"uppernav.xml\"/>\n".[/color]
" <navigation href=\"navigation.xml\"/>\n".
" <message>Das angegebene Dokument [b]$product[/b] wurde nicht gefunden.
\n".
" Benutzen Sie bitte die Navigationsleiste auf der linken Seite zur Auswahl.</message>\n".
"</product>"
);
In der rot markierten Zeile wird ein separates
XML-Dokument angegeben, das meine obere Navigationsleiste unter dem Banner enthält (wer meine Seite kennt, der weiß wovon ich rede). Mein XSL-Stylesheet macht aus der Angabe jetzt
HTML-Code:
Code:
<xsl:variable name="un" select="document(//uppernavigation/@href)"/>
<table class="UpperNav" border="0">
<colgroup>
<xsl:for-each select="$un/uppernavigation/uppernav">
<col><xsl:attribute name="width"><xsl:value-of select="@width"/></xsl:attribute></col>
</xsl:for-each>
</colgroup>
<tr><xsl:for-each select="$un/uppernavigation/uppernav">
<xsl:choose>
<xsl:when test="./*[name()='a']"><td><xsl:apply-templates/></td></xsl:when>
<xsl:otherwise><td class="UpperActiveNav"><xsl:apply-templates/></td></xsl:otherwise>
</xsl:choose>
</xsl:for-each></tr>
</table>
Problem: Leider funktioniert es nicht mit meinem temporären Dokument. Wenn ich stattdessen auf die herkömmliche Art und Weise ein vorhandene Fehler-
XML-Datei lade
Code:
if($xmldoc = domxml_open_file("$currentdir\\404.xml")) {
$root = $xmldoc->document_element();
$node = $root->get_elements_by_tagname("message");
$b = $node[0]->get_elements_by_tagname("b");
$txt = $xmldoc->create_text_node($product);
// ich habe einen leeren [b][/b]-Knoten in der Datei,
// der hier mit dem Namen der nicht vorhandenen
// Datei gefüllt wird
// (nur falls ihr wissen wolltet, was das soll ... ;))
$b[0]->append_child($txt);
}
dann sehe ich auch die obere Navigationsleiste, obwohl der Inhalt der Fehlerdatei exakt dem o.g. temporären Dokument entspricht.
Kann mir das jemand erklären?