Re: [xslt] Embedded Stylesheets
- From: Dave Hyatt <hyatt apple com>
- To: The Gnome XSLT library mailing-list <xslt gnome org>
- Subject: Re: [xslt] Embedded Stylesheets
- Date: Fri, 13 Aug 2004 16:29:29 -0700
Oh, and ignore all the obvious leaks in my function. I will fix them
later. ;)
dave
On Aug 13, 2004, at 4:22 PM, David Hyatt wrote:
Now that I have simple transforms using external stylesheets working
in Safari, I'm trying to make embedded stylesheets work. The example
I'm working with is one from Mozilla. Here it is:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="#stylesheet"?>
<!DOCTYPE doc [
<!ATTLIST xsl:stylesheet
id ID #REQUIRED>
]>
<doc>
<xsl:stylesheet version="1.0" id="stylesheet"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="xsl:stylesheet"/>
<xsl:template match="child">
<html>
<head><title>title of embedded stylesheet</title></head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="grandchild">
<h1>Transformation was <xsl:apply-templates/></h1>
</xsl:template>
</xsl:stylesheet>
<child><grandchild>Successful</grandchild></child>
</doc>
When I feed this content to libxml to parse, however, I get the
following error:
file:///Users/hyatt/Documents/xslexample2.xml:1: parser error : Extra
content at the end of the document
^
If I change the "text/xsl" MIME type to "text/css", the error
disappears. libxml basically fails to parse, and so I'm unable to
then run the code that would have tried to apply the stylesheet to the
doc (by using xsltLoadStylesheetPI to extract a stylesheet that I
could then apply to the xmlDoc).
Any ideas why this fails in libxml?
Here is my function in Safari (for the curious):
DocumentImpl* XSLTProcessorImpl::transformDocument(DocumentImpl* doc)
{
xsltStylesheetPtr sheet = NULL;
if (!m_embedded) {
if (!m_stylesheet || !m_stylesheet->document())
return 0;
sheet = xsltParseStylesheetDoc(m_stylesheet->document());
if (!sheet)
return 0;
}
// Create an XMLParserContext and then build up an xmlDocPtr
xmlParserCtxtPtr parser = xmlCreatePushParserCtxt(NULL, NULL,
NULL, 0, doc->URL().ascii());
const QChar BOM(0xFEFF);
const unsigned char BOMHighByte = *reinterpret_cast<const unsigned
char *>(&BOM);
xmlSwitchEncoding(parser, BOMHighByte == 0xFF ?
XML_CHAR_ENCODING_UTF16LE : XML_CHAR_ENCODING_UTF16BE);
xmlParseChunk(parser,
reinterpret_cast<const char
*>(doc->transformSource().unicode()),
doc->transformSource().length() * sizeof(QChar), 1);
xmlDocPtr sourceDoc = parser->myDoc;
if (!sourceDoc || !parser->wellFormed)
return 0; <------ THE FAILURE HAPPENS HERE
if (m_embedded) {
// Attempt to obtain the stylesheet from within our parsed
source document.
sheet = xsltLoadStylesheetPI(sourceDoc);
if (!sheet)
return 0;
}
xmlDocPtr resultDoc = xsltApplyStylesheet(sheet, sourceDoc, NULL);
DocumentImpl* result = documentFromXMLDocPtr(resultDoc, sheet);
if (m_stylesheet)
m_stylesheet->clearDocument();
xsltFreeStylesheet(sheet);
xmlFreeDoc(sourceDoc);
return result;
}
Thanks,
dave
(hyatt apple com)
_______________________________________________
xslt mailing list, project page http://xmlsoft.org/XSLT/
xslt gnome org
http://mail.gnome.org/mailman/listinfo/xslt
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]