Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#1

[PHP] XML-Problem

  Alt 6. Apr 2004, 21:22
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?
  Mit Zitat antworten Zitat