Closed Bug 258395 Opened 21 years ago Closed 21 years ago

Doesn't transform XML to HTML properly when CDATA is used to add HTML tags

Categories

(Core :: XSLT, defect)

x86
Windows 2000
defect
Not set
major

Tracking

()

RESOLVED DUPLICATE of bug 98168

People

(Reporter: ayalewk, Assigned: peterv)

Details

Attachments

(2 files)

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040113 Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040113 Transform the following XML with given XSL (open the XML with Mozilla 1.6 - (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040113): XML: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="xsl.xsl"?> <poem> <verse> -Seest thou yon dreary Plain, forlorn and wild, -Seest thou yon dreary Plain, forlorn and wild, </verse> </poem> XSL: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" encoding="UTF-8"/> <xsl:template match="/"> <HTML> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <xsl:template match="verse"> <p> <xsl:call-template name="InsertLineBreaks"> <xsl:with-param name="string" select="."/> <!-- previous_index is the number of dashes the previous line has. In this case there is no previous line therefore we pass 0 as the number of dashes for the previous string, so that if the next line has dashes the 'ordered bullet list' HTML tag can be opened --> <xsl:with-param name="previous_index" select="0"/> </xsl:call-template> </p> </xsl:template> <xsl:template name="InsertLineBreaks"> <xsl:param name="string"/> <xsl:param name="previous_index"/> <xsl:if test="normalize-space($string)"> <!-- index is the number of dashes this line has. In case this line is empty we assign index equal to the previous_index, because empty lines are ignored --> <xsl:variable name="index"> <xsl:choose> <xsl:when test="not(contains($string, '&#xA;')) or (string-length(normalize-space(substring-before($string, '&#xA;'))) &gt; 0)"> <xsl:value-of select="string-length(substring-before($string, substring(normalize-space(translate($string,'-',' ')), 1, 1))) - string-length(substring-before($string, substring(normalize-space($string), 1, 1)))"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$previous_index"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="contains($string, '&#xA;')"> <xsl:choose> <!-- If the string starts with a line-feed, do nothing --> <xsl:when test="starts-with($string, '&#xA;')"/> <xsl:otherwise> <!-- Output the substring before the first line-feed --> <xsl:call-template name="trimDash"> <xsl:with-param name="string" select="normalize-space(substring-before($string, '&#xA;'))"/> <xsl:with-param name="index" select="$index"/> <xsl:with-param name="previous_index" select="$previous_index"/> <!-- len is the normalized string length after the line break. If the string length is less than 0 we want we should close the 'ordered bullet list' HTML tag --> <xsl:with-param name="len" select="string-length(normalize-space(substring-after($string, '&#xA;')))"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> <!-- Call this template again --> <xsl:call-template name="InsertLineBreaks"> <!-- The rest of the string, i.e. the substring after the first line-feed --> <xsl:with-param name="string" select="substring-after($string,'&#xA;')"/> <xsl:with-param name="previous_index" select="$index"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <!-- Output the substring before the first line-feed --> <xsl:call-template name="trimDash"> <xsl:with-param name="string" select="normalize-space($string)"/> <xsl:with-param name="index" select="$index"/> <xsl:with-param name="previous_index" select="$previous_index"/> <!-- len is the normalized string length after the line break. If the string length is less than 0 we want we should close the 'ordered bullet list' HTML tag --> <xsl:with-param name="len" select="string-length(normalize-space(substring-after($string, '&#xA;')))"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <xsl:template name="trimDash"> <xsl:param name="string"/> <xsl:param name="previous_index"/> <xsl:param name="index"/> <xsl:param name="len"/> <xsl:choose> <xsl:when test="starts-with($string, '-')"> <xsl:call-template name="trimDash"> <xsl:with-param name="string" select="substring($string, 2)"/> <xsl:with-param name="index" select="$index"/> <xsl:with-param name="previous_index" select="$previous_index"/> <xsl:with-param name="len" select="$len"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:if test="$index - $previous_index &gt; 0"> <xsl:call-template name="openUL"> <xsl:with-param name="count" select="$index - $previous_index"/> </xsl:call-template> </xsl:if> <xsl:if test="$index - $previous_index &lt; 0"> <xsl:call-template name="closeUL"> <xsl:with-param name="count" select="$previous_index - $index"/> </xsl:call-template> </xsl:if> <xsl:choose> <xsl:when test="$index = 0"> <xsl:value-of select="$string"/> <BR/> </xsl:when> <xsl:otherwise> <LI> <xsl:value-of select="$string"/> </LI> </xsl:otherwise> </xsl:choose> <xsl:if test="$len = 0"> <xsl:call-template name="closeUL"> <xsl:with-param name="count" select="$index"/> </xsl:call-template> </xsl:if> <!-- Insert a line-feed to make it look pretty --> <xsl:text>&#xA;</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="openUL"> <xsl:param name="count"/> <xsl:if test="$count &gt; 0"> <xsl:text disable-output-escaping="yes"><![CDATA[<UL>]]></xsl:text> <!-- Insert a line-feed to make it look pretty --> <xsl:text>&#xA;</xsl:text> <xsl:call-template name="openUL"> <xsl:with-param name="count" select="$count - 1"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="closeUL"> <xsl:param name="count"/> <xsl:if test="$count &gt; 0"> <xsl:text disable-output-escaping="yes"><![CDATA[</UL>]]></xsl:text> <!-- Insert a line-feed to make it look pretty --> <xsl:text>&#xA;</xsl:text> <xsl:call-template name="closeUL"> <xsl:with-param name="count" select="$count - 1"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet> Reproducible: Always Steps to Reproduce: 1. See details 2. 3. Actual Results: I see the following in Mozilla browser: <UL> Seest thou yon dreary Plain, forlorn and wild, Seest thou yon dreary Plain, forlorn and wild, </UL> Expected Results: Bulleted list like this: . Seest thou yon dreary Plain, forlorn and wild, . Seest thou yon dreary Plain, forlorn and wild,
We are not going to work on this without an appropriate testcase, see http://www.mozilla.org/projects/xslt/bug-reporting.html
Chances are this is the "IE actually serializes and reparses the output instead of converting directly between DOMs" issue. And if its serializer is buggy, it won't escape things right and you'll end up parsing the "<ul>" string which that template is inserting as literal CDATA....
(Ayalew) I get comments that this may have worked in IE and not in Mozilla. But I have tested it with not only in IE, but also jdk 1.4 and Apache XSL processors and the out put is a good HTML file. The mozilla parser however fails to generate the HTML when CDATA is used to add HTML tags.
<xsl:text disable-output-escaping="yes"> is not supported. *** This bug has been marked as a duplicate of 98168 ***
Status: UNCONFIRMED → RESOLVED
Closed: 21 years ago
Resolution: --- → DUPLICATE
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: