You might consider server-side XML-to-XML transformations rare, but you have to use <xsl:output method=”xml”> if you want to generate valid XHTML code from your XML data. To shorten the printouts, we’ll use a simple (non-XHTML) XSL transformation to generate the test results:
<?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="utf-8" /> <xsl:template match="root"> <output> Greek letter: <xsl:value-of select="@greek" /> EE: <xsl:value-of select="@ee" /> </output> </xsl:template> </xsl:stylesheet>
As with HTML, MSXML3 interferes with the output, inserting improper UTF-16 encoding directive, resulting in the following XML text:
<?xml version="1.0" encoding="UTF-16"?> <output> Greek letter: β EE: č </output>
You could bypass this bug by setting the omit-xml-declaration attribute of the xsl:output element to yes …
<?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" /> … rest deleted …
… resulting in the following transformation output:
<output> Greek letter: β EE: č </output>
However, if you want to retain XML declaration in the XML document, you have to replace UTF-16 in the output string with UTF-8, like we did in the HTML transformation case. The following modified test program produces perfect XML document when used with the original XSLT transformation (without the omit-xml-declaration attribute):
<% Const DOMClass = "MSXML2.DOMDocument" Set XSLT = Server.CreateObject(DOMClass) Set XDoc = Server.CreateObject(DOMClass) XDoc.loadXML("<root greek='β' ee='č' />") XSLT.load(Server.MapPath("SampleXSLT.xsl")) Response.Clear Response.Charset = "utf-8" Response.Codepage = 65001 Response.Write Replace(XDoc.transformNode(XSLT), _ "encoding=""UTF-16""","encoding=""utf-8""") %>
No comments:
Post a Comment