#44279 [Opn->Bgs]: transformToXml does not properly close tags when stylesheet output is xml
ID: 44279
Updated by: chregu@php.net
Reported By: phpbugs at xmlnode dot com
-Status: Open
+Status: Bogus
Bug Type: XSLT related
Operating System: Debian 2.6 stable
PHP Version: 5.2.5
New Comment:
If I run your code on a commandline PHP it does work correctly:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 //EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<html
xml:lang="en"><head><title>whatever</title></head><body><br/><hr/><img
src="somesource"/></body></html>
I assume, the conversion from <br/> to <br> happens somewhere else in
your case, either the browser or apache. try something like wget to
get the raw source of your output.
My experience with the xslt extension also tells me, that this can0t
be PHPs fault, I never saw something like that. Also your experience
with the difference between saveXML and save tells me, that the
conversion happens somewhere else.
Previous Comments:
------------------------------------------------------------------------
[2008-02-28 01:06:36] phpbugs at xmlnode dot com
Description:
------------
It's pretty basic, I have an xsl stylesheet with an output method of
xml and an encoding of iso-8859-1 (which doesn't matter) using xhtml11
as the doctype, but the same is seen for other xhtml doctypes. When I
call transformToXML I get tags like this:
<hr> <br> <link ...>
when I call transformToURI() I get the proper tags <hr/> <br /> <link
/>, etc. If I call transformToDoc() and then use saveXML() I still
see the open tags <hr> <br> <link ...>, but if I call transformToDoc
and then save() the tags are correct. I would have thought it was a
browser-specific issue, but I've tried every browser available to me
(7 total across multiple platforms) My guess is that internally save
and transformToURI; which work, call the same method, but that
transformToXML and saveXML which don't work call the same somewhat
broken method.
Reproduce code:
---------------
stylesheet (condensed):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" media-type="text/html"
doctype-public="-//W3C//DTD XHTML 1.1 //EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"
omit-xml-declaration="yes" encoding="iso-8859-1"/>
<xsl:template match="/"><html
xml:lang="en"> <head><title>whatever</title></head><body><br/><hr/><img
src='somesource'/></body></html></xsl:template>
$xml = new DOMDocument('1.0');
$xml->loadXML('<PAGE/>');
$xsl = new DOMDocument('1.0);
$xsl->load(<path to stylesheet>); // you'll need to set this
$proc = new XsltProcessor();
$proc->importStylesheet($xsl);
echo $proc->transformToDoc($xml);
Expected result:
----------------
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 //EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<html
xml:lang="en"><head><title>whatever</title></head><body><br/><hr/><img
src="somesource"/></body></html>
I should note that this is the output from either transformToURI($xml,
<path>) or $dom = transformToDOC($xml); $dom->save(<path>); In fact if
you want you can just change $dom->save(path) to $dom->saveXML() and
you'll get completely different results.
Actual result:
--------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 //EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<?xml version="1.0" encoding="iso-8859-1"?><html
xml:lang="en">
<head><title>whatever</title></head>
<body>
<br><hr>
<img src="somesource">
</body>
</html>
You'll notice that not only are the tags not closed the XML
declaration is in a different spot.
I assume you'll ask, because I know I would, but I'm running the
absolute latest libxml2 (2.6.31) and libxsl (1.1.22), compiled
everything last night (2/26/2008) saw the behavior before upgrading
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=44279&edit=1
Thread (3 messages)