2010-12-02 3 views
2

Ich muss meine XML-Ausgabe in HTML umwandeln. Ich befolge ein Tutorial unter link text Mein Code ist die Ausgabe von XML-Tags in einer einzigen Zeile ohne Formatierung mit Text-Wert. Ich möchte die Ausgabe als eine HTML-ungeordnete Liste folgende hierarchische Struktur des übergeordneten untergeordneten in XML-Dateiausgabe. HierTransformieren von XML-Daten in HTML mit XSL und PHP: nur Drucken von XML-Tags ohne Formatierung

ist Seitenausgabe:

message msg 1message msg 1-1message msg 1-2message msg 1-2-1message msg 1-2-2message 
msg 1-2-2-1message msg 1-2-2-1-1message msg 1-2-2-1-2 

& hier Seite Quelle:

<html:ul xmlns:html="http://www.w3.org/1999/xhtml"><html:li>message msg 1</html:li> 
<html:ul><html:li>message msg 1-1</html:li><html:li>message msg 1-2</html:li><html:ul> 
<html:li>message msg 1-2-1</html:li><html:li>message msg 1-2-2</html:li><html:ul> 
<html:li>message msg 1-2-2-1</html:li><html:ul><html:li>message msg 1-2-2-1-1</html:li> 
<html:li>message msg 1-2-2-1-2</html:li></html:ul></html:ul></html:ul></html:ul></html:ul> 

Hier ist mein Code

php file: 

<?php 
# LOAD XML FILE 
$XML = new DOMDocument(); 
$XML->load('messages.xml'); 

# START XSLT 
$xslt = new XSLTProcessor(); 
$XSL = new DOMDocument(); 
$XSL->load('msg.xsl'); 
$xslt->importStylesheet($XSL); 
print $xslt->transformToXML($XML); 
?> 

msg.xsl:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:html="http://www.w3.org/1999/xhtml"> 
    <xsl:output omit-xml-declaration="yes" /> 

    <xsl:template match="messages"> 
    <html:ul> 
     <xsl:apply-templates select="message" /> 
    </html:ul> 
    </xsl:template> 

    <xsl:template match="message[message]"> 
    <html:li>message <xsl:value-of select="@msg_id" /></html:li> 
    <html:ul> 
     <xsl:apply-templates select="message" /> 
    </html:ul> 
    </xsl:template> 

    <xsl:template match="message"> 
    <html:li>message <xsl:value-of select="@msg_id" /></html:li> 
    <xsl:apply-templates select="message" /> 
    </xsl:template> 
</xsl:stylesheet> 

messages.xml

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="msg.xsl"?><messages> 
    <message msg_id="1" emp_msg="msg 1" parent_msg_id="" parent_msg="" depth="0"> 
     <message msg_id="2" emp_msg="msg 1-1" parent_msg_id="1" parent_msg="msg 1" depth="1"/> 
     <message msg_id="3" emp_msg="msg 1-2" parent_msg_id="1" parent_msg="msg 1" depth="1"> 
      <message msg_id="4" emp_msg="msg 1-2-1" parent_msg_id="3" parent_msg="msg 1-2" depth="2"/> 
      <message msg_id="5" emp_msg="msg 1-2-2" parent_msg_id="3" parent_msg="msg 1-2" depth="2"> 
       <message msg_id="6" emp_msg="msg 1-2-2-1" parent_msg_id="5" parent_msg="msg 1-2-2" depth="3"> 
        <message msg_id="7" emp_msg="msg 1-2-2-1-1" parent_msg_id="6" parent_msg="msg 1-2-2-1" depth="4"/> 
        <message msg_id="8" emp_msg="msg 1-2-2-1-2" parent_msg_id="6" parent_msg="msg 1-2-2-1" depth="4"/> 
       </message> 
      </message> 
     </message> 
    </message> 
</messages> 
+0

Ist die XML-Datei wegen eines Ausschneiden- und Einfügefehlers nicht gültig oder möchten Sie das ändern? - Letzte Zeile "" lauten. –

+0

Wie sieht Ihre Ausgabe aus und wie soll sie aussehen? –

+0

@Chris Bentley, das ist nur Ausschneiden und Einfügen Fehler. Ich habe den Fehler behoben, weil "loadXML" anstelle von "load" verwendet wurde, um xml doc zu laden. Obwohl es keine Ergebnisse zeigt, nur Tags ausgeben. Ich habe meine Frage aktualisiert. – XCeptable

Antwort

1

Ihr Sheet nicht ausgibt HTML sondern ein XHTML-Fragment, und das in einer Art und Weise (mit qualifizierten Namen), die Sie als application/xml an einen Browser dienen müssen (wie Mozilla, Opera, Safari, IE 9, aber nicht IE 6-8), die diesen Inhaltstyp versteht.

So stellen Sie sicher, tun Sie so etwas wie

header('Content-Type: application/xml'); 

bevor der Inhalt an den Browser gesendet wird. Oder lassen Sie einen beliebigen XHTML-Namespace und beliebige Präfixe aus den Ergebniselementen fallen, dann gibt das XSLT-Stylesheet ein HTML-Fragment aus, das viele weitere Browser als Text/HTML analysieren und verstehen und nach Belieben rendern können.

+0

Wo sollte ich diese Header-Informationen setzen. – XCeptable

+0

Header ist eine PHP-Funktion http://php.net/manual/en/function.header.Wenn Sie also PHP verwenden, müssen Sie den Aufruf der sbown-Funktion in Ihrem PHP-Code vornehmen, bevor Sie den Inhalt an den Browser senden. Stellen Sie also sicher, dass Sie ihn vor die print-Anweisung setzen. –

+0

@XCeptable: Sie können den 'html'-Namespace loswerden, indem Sie das' xmlns: html'-Attribut entfernen und das 'html:' vor jedem Element entfernen. Stellen Sie sicher, dass Sie den 'xsl'-Namespace in Ruhe lassen, da dies erforderlich ist, um das XSLT-Programm zu verwenden. –

0

Um cross, würde ich dieses Sheet verwenden:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" 
       doctype-public="-//W3C//DTD HTML 4.0//EN" 
       doctype-system="http://www.w3.org/TR/html4/strict.dtd"/> 
    <xsl:template match="messages"> 
     <html> 
      <body> 
       <xsl:apply-templates select="*[1]"/> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="message[1]"> 
     <ul> 
      <xsl:call-template name="makeListItem"/> 
     </ul> 
    </xsl:template> 
    <xsl:template match="message" name="makeListItem"> 
     <li> 
      <xsl:value-of select="concat('message ',@msg_id)" /> 
      <xsl:apply-templates select="*[1]"/> 
     </li> 
     <xsl:apply-templates select="following-sibling::*[1]"/> 
    </xsl:template> 
</xsl:stylesheet> 

Ausgang:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<body> 
<ul> 
<li>message 1 
    <ul> 
    <li>message 2</li> 
    <li>message 3 
    <ul> 
    <li>message 4</li> 
    <li>message 5 
     <ul> 
     <li>message 6 
     <ul> 
     <li>message 7</li> 
     <li>message 8</li> 
     </ul> 
     </li> 
     </ul> 
    </li> 
    </ul> 
    </li> 
    </ul> 
</li> 
</ul> 
</body> 
</html> 

Render als:

  • Nachricht 1
    • Nachricht 2
    • Nachricht 3
      • Nachricht 4
      • Nachricht 5
        • Nachricht 6
          • Nachricht 7
          • Nachricht 8

Hinweis: HTML DOCTYPE, kein Namespace. Auch andere Herangehensweise an hierarchische Verarbeitung mit feinkörnigem Durchlauf.

+0

@Alejandro, habe ich das verwendet, aber es druckt einfach xml ohne Formatierung – XCeptable

+0

@XCeptable: Sehr seltsam! Ich habe mit Ihrem exakten PHP-Code, Ihrem genauen Eingabe-Beispiel und meinem Stylesheet getestet. –

+0

@@ Alejandro, die Nachricht, die es druckt, ist "keine Stilinformation" – XCeptable

Verwandte Themen