[xslt] Embedded Stylesheets
- From: David Hyatt <hyatt apple com>
- To: xslt gnome org
- Subject: [xslt] Embedded Stylesheets
- Date: Fri, 13 Aug 2004 16:22:45 -0700
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)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]