XML zu validem XHTML?!

dshock

Mitglied
Hallo zusammen!

Ich habe eine kleine XML-Datei, welche ich mittel XSLT in eine XHTML 1.0 Transitional-Datei ausgeben möchte. Bisher sieht meine XSLT-Datei wie folgt aus:

HTML:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xhtml" version="1.0" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
</head>
<body>
	<h1>TEST</h1>
	<h2><xsl:apply-templates/></h2>
</body>
</html>

</xsl:template>

<xsl:template match="users">
	<xsl:value-of select="user/@id"/>..<xsl:value-of select="user"/><br/>
	<xsl:value-of select="user/@sig"/><br/>
</xsl:template>

</xsl:stylesheet>

Das Problem ist, dass weder das HTML-Tag (<html xmlns="http://www.w3.org/1999/xhtml">) noch die breaks (<br/>) oder die Meta Angabe (<meta...) korrekt im Sourcecode auftauchen. Dort kommt dann: <html>, <br> und <META... .

Kann mir da jemand von euch helfen?! :)


Vielen Dank schonmal im voraus!!
 
Hi.

Es gibt keine "xhtml" Ausgabe-Methode. Wenn du XHTML ausgeben willst solltest du xml für das method-Attribut angeben - schließlich ist XHTML valides XML.

Gruß
 
Hallo Allerseits!

Ich habe das gleiche Problem, nur daß bei mir kein XHTML ausgegeben wird, obwohl ich das Attribut method="xml" verwendet habe. Meine Output-Tag sieht so aus:

<xsl:eek:utput method="xml" indent="yes" media-type="text/xml"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
encoding="ISO-8859-1" />


Weiß jemand, woran das liegen könnte?

Gruß
Gunwald
 
Hi.

So kann man das leider kaum nachvollziehen warum das nicht funktioniert. Mach mal ein einfaches Beispiel so das man das ausprobieren kann.

Was für einen XSLT Prozessor verwendest du denn?

Gruß
 
Hallo deepthroat!

Im Folgenden ein Beispiel wie die von mir verewndeten XSL-Stylesheets aussehen. Alle anderen Stylesheets von denen aus dieses eingebunden wird und welche dieses einbindet haben das gleiche Output-Tag.

HTML:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" media-type="text/xml"
            doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
            doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
            encoding="ISO-8859-1" />
			
<xsl:template match="/">

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Titel</title>
</head>
<body>


<div id="leftBox" style="clear:both;">
<xsl:call-template name="menu" />		 
</div>


<xsl:call-template name="info" />		


<xsl:apply-templates />


</body>
</html>
</xsl:template>
</xsl:stylesheet>

Die XML-Dateien sehen so aus:

HTML:
<?xml version="1.0" encoding="iso-8859-1"?>

<data xmlns:xi="http://www.w3.org/2001/XInclude">
	
	<menu>
		<entry selected="false" >
			<menuName>Menüpunkt 1</menuName>
			<link>#</link>
			<contentId>0</contentId>
		</entry>
		<entry selected="true">
			<menuName>Menüpunkt 2</menuName>
			<link>#</link>
			<contentId>1</contentId>
		</entry>
		<entry selected="false">
			<menuName>Menüpunkt 2</menuName>
			<link>#</link>
			<contentId>2</contentId>
		</entry>
	</menu>

</data>

Ich benutze den XSL(T)-Prozessor von PHP5 also die "libxslt"-Erweiterung.
Es funktioniert auch alles, aber leider wird nur HTML ausgegeben, nicht aber XHTML.
Leider fehlt mir jeglicher Ansatz für die Lösung des Problems, da ich keinen Fahler erkennen kann.

Gruß
Gunwald
 
Evtl. ist das dann eher ein PHP Problem?

Du benutzt nicht zufällig die transformToDoc Funktion?

Note that if you want to use an XSLT feature such as <xsl:eek:utput method="html"> or indent="yes", you can't use transformToDoc(), because the DomDocument cannot retain this information.

Gruß
 
Hallo deepthroat!

Danke für den Hinweis. Ich hatte auch schon vermutet, daß das Problem beim XSL(T)-Prozessor liegt, allerdings habe ich den Hinweis, daß die Mehtode transformToDoc() der Klasse XSLTProcessor die Angaben in dem "method"-Tag ignorieren, in der PHP-Dokumentation nicht gefunden. Woher hast Du zetiert?
Im übrigen läßt sich das Problem einfach umgehen, indem man an Stelle der benannten Methode die Methode transformToXML() verwendet.
Bei mir funktioniert es jetzt einwandfrei und ich habe in der Online-Version der PHP-Dokumentation auch folgenden Benutzerkommentar gefunden:
In most cases if you expect XML (or XHTML) as output you better use transformToXML() directly. You gain better control over xsl:eek:utput attributes, notably omit-xml-declaration.

Instead of :
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$dom = $proc->transformToDoc($xml);
echo $dom->saveXML();

do use :
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$newXml = $proc->transformToXML($xml);
echo $newXml;

In the first case, <?xml version="1.0" encoding="utf-8"?> is added whatever you set the omit-xml-declaration while transformToXML() take the attribute into account.

Danke für die Hinweise und einen herzlichen Gruß
Gunwald
 
Hallo deepthroat!

Danke für den Hinweis. Ich hatte auch schon vermutet, daß das Problem beim XSL(T)-Prozessor liegt, allerdings habe ich den Hinweis, daß die Mehtode transformToDoc() der Klasse XSLTProcessor die Angaben in dem "method"-Tag ignorieren, in der PHP-Dokumentation nicht gefunden. Woher hast Du zetiert?
Das hatte ich hier gefunden. (In dem letzen Paragraph vor dem nächsten Abschnitt)

Gruß
 

Neue Beiträge

Zurück