Fix for bug #68605 (correct the XSLT document() function). Patch by Jonas Sicking <sicking@bigfoot.com>, r=me. Not part of the default build.

git-svn-id: svn://10.0.0.236/trunk@88584 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
Peter.VanderBeken%pandora.be
2001-03-06 00:12:43 +00:00
parent c3e8536f42
commit c14341fb3e
13 changed files with 226 additions and 111 deletions

View File

@@ -31,7 +31,7 @@
* -- read XML from stdin when -i is omitted
* -- accept '-' to specify stdin/stdout on command line
*
* $Id: transformiix.cpp,v 1.7 2000-09-29 14:58:26 axel%pike.org Exp $
* $Id: transformiix.cpp,v 1.8 2001-03-06 00:12:37 Peter.VanderBeken%pandora.be Exp $
*/
@@ -121,22 +121,18 @@ int main(int argc, char** argv) {
String documentBase;
if ( !xsltFilename ) {
if (!xmlFilename) {
cerr << "you must specify XSLT file with -s option if XML is read from standard input" << endl;
printUsage();
return -1;
cerr << "you must specify XSLT file with -s option if XML is read from standard input" << endl;
printUsage();
return -1;
}
//-- use xml document to obtain a document base
URIUtils::getDocumentBase(*xmlFilename, documentBase);
xsltProcessor.process(*xmlInput, *resultOutput, documentBase);
xsltProcessor.process(*xmlInput, *xmlFilename, *resultOutput);
}
else {
//-- open XSLT file
char* chars = new char[xsltFilename->length()+1];
ifstream xsltInput(xsltFilename->toCharArray(chars), ios::in);
delete chars;
// obtain document base from XSLT stylesheet
URIUtils::getDocumentBase(*xsltFilename, documentBase);
xsltProcessor.process(*xmlInput, xsltInput, *resultOutput, documentBase);
xsltProcessor.process(*xmlInput, *xmlFilename, xsltInput, *xsltFilename, *resultOutput);
}
resultFileStream.close();
return 0;

View File

@@ -29,7 +29,7 @@
* -- 20000326
* -- added Mozilla integration code
*
* $Id: URIUtils.cpp,v 1.7 2001-01-12 20:06:13 axel%pike.org Exp $
* $Id: URIUtils.cpp,v 1.8 2001-03-06 00:12:40 Peter.VanderBeken%pandora.be Exp $
*/
#include "URIUtils.h"
@@ -38,7 +38,7 @@
* URIUtils
* A set of utilities for handling URIs
* @author <a href="mailto:kvisco@ziplink.net">Keith Visco</a>
* @version $Revision: 1.7 $ $Date: 2001-01-12 20:06:13 $
* @version $Revision: 1.8 $ $Date: 2001-03-06 00:12:40 $
**/
#ifndef MOZ_XSL
@@ -60,53 +60,25 @@ const short URIUtils::PATH_MODE = 4;
* Returns an InputStream for the file represented by the href
* argument
* @param href the href of the file to get the input stream for.
* @param documentBase the document base of the href argument, if it
* is a relative href
* set documentBase to null if there is none.
* @return an InputStream to the desired resource
* @exception java.io.FileNotFoundException when the file could not be
* found
**/
istream* URIUtils::getInputStream
(String& href, String& documentBase, String& errMsg)
(String& href, String& errMsg)
{
istream* inStream = 0;
//-- check for URL
ParsedURI* uri = parseURI(href);
if ( !uri->isMalformed ) {
inStream = openStream(uri);
delete uri;
return inStream;
}
delete uri;
//-- join document base + href
String xHref;
if (documentBase.length() > 0) {
xHref.append(documentBase);
if (documentBase.charAt(documentBase.length()-1) != HREF_PATH_SEP)
xHref.append(HREF_PATH_SEP);
}
xHref.append(href);
//-- check new href
uri = parseURI(xHref);
if ( !uri->isMalformed ) {
inStream = openStream(uri);
}
else {
// Try local files
char* fchars = new char[xHref.length()+1];
ifstream* inFile = new ifstream(xHref.toCharArray(fchars), ios::in);
char* fchars = new char[href.length()+1];
inStream = new ifstream(href.toCharArray(fchars), ios::in);
delete fchars;
if ( ! *inFile ) {
fchars = new char[href.length()+1];
(*inFile).open(href.toCharArray(fchars), ios::in);
delete fchars;
}
inStream = inFile;
}
delete uri;
@@ -119,7 +91,7 @@ istream* URIUtils::getInputStream
* Returns the document base of the href argument
* @return the document base of the given href
**/
void URIUtils::getDocumentBase(String& href, String& dest) {
void URIUtils::getDocumentBase(const String& href, String& dest) {
#ifdef MOZ_XSL
String docBase("");
nsCOMPtr<nsIURI> pURL;
@@ -173,7 +145,7 @@ void URIUtils::getDocumentBase(String& href, String& dest) {
* if necessary.
* The new resolved href will be appended to the given dest String
**/
void URIUtils::resolveHref(String& href, String& documentBase, String& dest) {
void URIUtils::resolveHref(const String& href, const String& base, String& dest) {
#ifdef MOZ_XSL
nsCOMPtr<nsIURI> pURL;
nsresult result = NS_OK;
@@ -181,7 +153,7 @@ void URIUtils::resolveHref(String& href, String& documentBase, String& dest) {
NS_WITH_SERVICE(nsIIOService, pService, kIOServiceCID, &result);
if (NS_SUCCEEDED(result)) {
// XXX This is ugly, there must be an easier (cleaner way).
char *baseStr = (documentBase.getConstNSString()).ToNewCString();
char *baseStr = (base.getConstNSString()).ToNewCString();
result = pService->NewURI(baseStr, nsnull, getter_AddRefs(pURL));
nsCRT::free(baseStr);
if (NS_SUCCEEDED(result)) {
@@ -197,6 +169,9 @@ void URIUtils::resolveHref(String& href, String& documentBase, String& dest) {
}
}
#else
String documentBase;
getDocumentBase(base, documentBase);
//-- check for URL
ParsedURI* uri = parseURI(href);
if ( !uri->isMalformed ) {
@@ -231,9 +206,28 @@ void URIUtils::resolveHref(String& href, String& documentBase, String& dest) {
}
delete uri;
delete newUri;
//cout << "\n---\nhref='" << href << "', base='" << base << "'\ndocumentBase='" << documentBase << "', dest='" << dest << "'\n---\n";
#endif
} //-- resolveHref
void URIUtils::getFragmentIdentifier(const String& href, String& frag) {
Int32 pos;
pos = href.lastIndexOf('#');
if(pos != NOT_FOUND)
href.subString(pos+1, frag);
else
frag.clear();
} //-- getFragmentIdentifier
void URIUtils::getDocumentURI(const String& href, String& docUri) {
Int32 pos;
pos = href.lastIndexOf('#');
if(pos != NOT_FOUND)
href.subString(0,pos,docUri);
else
docUri = href;
} //-- getFragmentIdentifier
#ifndef MOZ_XSL
istream* URIUtils::openStream(ParsedURI* uri) {
if ( !uri ) return 0;

View File

@@ -31,7 +31,7 @@
* -- 20000326
* -- added Mozilla integration code
*
* $Id: URIUtils.h,v 1.10 2001-01-12 20:06:13 axel%pike.org Exp $
* $Id: URIUtils.h,v 1.11 2001-03-06 00:12:31 Peter.VanderBeken%pandora.be Exp $
*/
#include "TxString.h"
@@ -56,7 +56,7 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
* A utility class for URI handling
* Not yet finished, only handles file URI at this point
* @author <a href="mailto:kvisco@ziplink.net">Keith Visco</a>
* @version $Revision: 1.10 $ $Date: 2001-01-12 20:06:13 $
* @version $Revision: 1.11 $ $Date: 2001-03-06 00:12:31 $
*
**/
@@ -90,20 +90,32 @@ public:
static istream* getInputStream
(String& href, String& documentBase, String& errMsg);
(String& href, String& errMsg);
/**
* Returns the document base of the href argument
* The document base will be appended to the given dest String
**/
static void getDocumentBase(String& href, String& dest);
static void getDocumentBase(const String& href, String& dest);
/**
* Resolves the given href argument, using the given documentBase
* if necessary.
* The new resolved href will be appended to the given dest String
**/
static void resolveHref(String& href, String& documentBase, String& dest);
static void resolveHref(const String& href, const String& base, String& dest);
/**
* Returns the fragment identifier of the given URI, or "" if none exists
* frag is cleared before the idetifier is appended
**/
static void getFragmentIdentifier(const String& href, String& frag);
/**
* Returns the document location of given the URI (ie everything except
* fragment). docUri is cleared before the URI is appended
**/
static void getDocumentURI(const String& href, String& docUri);
private:

View File

@@ -28,6 +28,7 @@
#include "mozilladom.h"
#include "nsLayoutCID.h"
#include "nsIURL.h"
static NS_DEFINE_CID(kIDOMDOMImplementationCID, NS_DOM_IMPLEMENTATION_CID);
@@ -846,3 +847,22 @@ MITREObject* Document::removeWrapper(MozillaObjectWrapper* aObject)
nsISupportsKey key(aObject->getNSObj());
return (MITREObject*)wrapperHashTable->Remove(&key);
}
String Document::getBaseURI()
{
String url;
nsIURI* docURL = nsnull;
nsCOMPtr<nsIDocument> sourceNsDocument(do_QueryInterface(nsDocument));
sourceNsDocument->GetBaseURL(docURL);
if (docURL) {
char* urlString;
docURL->GetSpec(&urlString);
url = urlString;
nsCRT::free(urlString);
NS_IF_RELEASE(docURL);
}
return url;
}

View File

@@ -27,7 +27,10 @@
*/
#include "mozilladom.h"
#include "ArrayList.h"
#include "URIUtils.h"
const String XMLBASE_ATTR = "xml:base";
MOZ_DECL_CTOR_COUNTER(Node)
/**
@@ -405,3 +408,49 @@ MBool Node::hasChildNodes() const
nsNode->HasChildNodes(&returnValue);
return returnValue;
}
/**
* Returns the base URI of the node. Acccounts for xml:base
* attributes.
*
* @return base URI for the node
**/
String Node::getBaseURI()
{
Node* node=this;
ArrayList baseUrls;
String url;
Node* xbAttr;
while(node) {
switch(node->getNodeType()) {
case Node::ELEMENT_NODE :
xbAttr = ((Element*)node)->getAttributeNode(XMLBASE_ATTR);
if(xbAttr)
baseUrls.add(new String(xbAttr->getNodeValue()));
break;
case Node::DOCUMENT_NODE :
baseUrls.add(new String(((Document*)node)->getBaseURI()));
break;
default:
break;
}
node = node->getParentNode();
}
if(baseUrls.size()) {
url = *((String*)baseUrls.get(baseUrls.size()-1));
for(int i=baseUrls.size()-2;i>=0;i--) {
String dest;
URIUtils::resolveHref(*(String*)baseUrls.get(i), url, dest);
url = dest;
}
}
baseUrls.clear(MB_TRUE);
return url;
} //-- getBaseURI

View File

@@ -71,7 +71,7 @@ EXPORTS = \
$(NULL)
LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I..\..\..\base -I..\..\dom \
-I..\..
-I..\.. -I..\..\..\net
LCFLAGS = \
$(LCFLAGS) \

View File

@@ -188,6 +188,9 @@ class Node : public MozillaObjectWrapper
virtual MBool hasChildNodes() const;
//From DOM3 26-Jan-2001 WD
virtual String getBaseURI();
protected:
String nodeName;
String nodeValue;
@@ -331,6 +334,9 @@ class Document : public Node
Element* getElementById(const String aID);
//Override to return documentBaseURI
String getBaseURI();
private:
nsIDOMDocument* nsDocument;

View File

@@ -34,7 +34,7 @@
* -- Removed a number of castings of XML_Char to DOM_CHAR since they
* were not working on Windows properly
*
* $Id: XMLParser.cpp,v 1.13 2001-01-22 21:54:20 axel%pike.org Exp $
* $Id: XMLParser.cpp,v 1.14 2001-03-06 00:12:18 Peter.VanderBeken%pandora.be Exp $
*/
#include "XMLParser.h"
@@ -77,13 +77,14 @@ XMLParser::~XMLParser()
} //-- ~XMLParser
Document* XMLParser::getDocumentFromURI
(String& href, String& documentBase, String& errMsg)
(const String& href, const String& baseUri, String& errMsg)
{
String documentURL;
URIUtils::resolveHref(href, baseUri, documentURL);
#ifdef MOZ_XSL
nsresult rv = NS_OK;
String documentURL;
URIUtils::resolveHref(href, documentBase, documentURL);
nsCOMPtr<nsIURI> documentURI;
NS_WITH_SERVICE(nsIIOService, pService, kIOServiceCID, &rv);
if (NS_FAILED(rv)) return NULL;
@@ -102,11 +103,11 @@ Document* XMLParser::getDocumentFromURI
return new Document(theDocument);
#else
istream* xslInput = URIUtils::getInputStream(href, documentBase, errMsg);
istream* xslInput = URIUtils::getInputStream(documentURL, errMsg);
Document* resultDoc = 0;
if ( xslInput ) {
resultDoc = parse(*xslInput);
resultDoc = parse(*xslInput, documentURL);
delete xslInput;
}
if (!resultDoc) {
@@ -122,7 +123,7 @@ Document* XMLParser::getDocumentFromURI
* Parses the given input stream and returns a DOM Document.
* A NULL pointer will be returned if errors occurred
**/
Document* XMLParser::parse(istream& inputStream)
Document* XMLParser::parse(istream& inputStream, const String& uri)
{
const int bufferSize = 1000;
@@ -137,6 +138,7 @@ Document* XMLParser::parse(istream& inputStream)
XML_Parser parser = XML_ParserCreate(NULL);
ParserState ps;
ps.document = new Document();
ps.document->documentBaseURI = uri;
ps.currentNode = ps.document;
XML_SetUserData(parser, &ps);

View File

@@ -23,7 +23,7 @@
* Keith Visco
* -- finished implementation
*
* $Id: XMLParser.h,v 1.7 2001-01-22 21:54:20 axel%pike.org Exp $
* $Id: XMLParser.h,v 1.8 2001-03-06 00:12:43 Peter.VanderBeken%pandora.be Exp $
*/
#include <iostream.h>
@@ -46,7 +46,7 @@ typedef struct {
* parsing is provided by EXPAT.
* @author <a href="tomk@mitre.org">Tom Kneeland</a>
* @author <a href="kvisco@ziplink.net">Keith Visco</a>
* @version $Revision: 1.7 $ $Date: 2001-01-22 21:54:20 $
* @version $Revision: 1.8 $ $Date: 2001-03-06 00:12:43 $
**/
class XMLParser
{
@@ -67,9 +67,9 @@ class XMLParser
XMLParser();
~XMLParser();
Document* getDocumentFromURI(String& href, String& documentBase, String& errMsg);
Document* getDocumentFromURI(const String& href, const String& baseUri, String& errMsg);
#ifndef MOZ_XSL
Document* parse(istream& inputStream);
Document* parse(istream& inputStream, const String& uri);
const String& getErrorString();
protected:

View File

@@ -25,17 +25,18 @@
* -- added code in ::resolveFunctionCall to support the
* document() function.
*
* $Id: ProcessorState.cpp,v 1.19 2001-02-15 09:21:03 axel%pike.org Exp $
* $Id: ProcessorState.cpp,v 1.20 2001-03-06 00:12:13 Peter.VanderBeken%pandora.be Exp $
*/
/**
* Implementation of ProcessorState
* Much of this code was ported from XSL:P
* @version $Revision: 1.19 $ $Date: 2001-02-15 09:21:03 $
* @version $Revision: 1.20 $ $Date: 2001-03-06 00:12:13 $
**/
#include "ProcessorState.h"
#include "XSLTFunctions.h"
#include "URIUtils.h"
//-------------/
//- Constants -/
@@ -681,6 +682,24 @@ void ProcessorState::stripSpace(String& names) {
} //-- stripSpace
/**
* Adds a document to set of loaded documents
**/
void ProcessorState::addLoadedDocument(Document* doc, String& url) {
String docUrl;
URIUtils::getDocumentURI(url, docUrl);
loadedDocuments.put(docUrl, doc);
}
/**
* Returns a loaded document given it's url. NULL if no such doc exists
**/
Document* ProcessorState::getLoadedDocument(String& url) {
String docUrl;
URIUtils::getDocumentURI(url, docUrl);
return (Document*) loadedDocuments.get(docUrl);
}
//--------------------------------------------------/
//- Virtual Methods from derived from ContextState -/
//--------------------------------------------------/
@@ -791,7 +810,7 @@ FunctionCall* ProcessorState::resolveFunctionCall(const String& name) {
String err;
if (DOCUMENT_FN.isEqual(name)) {
return new DocumentFunctionCall(xslDocument);
return new DocumentFunctionCall(this, xslDocument);
}
else if (KEY_FN.isEqual(name)) {
err = "function not yet implemented: ";
@@ -1031,5 +1050,8 @@ void ProcessorState::initialize() {
//cout << "XSLT namespace: " << xsltNameSpace << endl;
}
//-- Make sure all loaded documents get deleted
loadedDocuments.setObjectDeletion(MB_TRUE);
}

View File

@@ -21,7 +21,7 @@
* Keith Visco, kvisco@ziplink.net
* -- original author.
*
* $Id: ProcessorState.h,v 1.10 2001-01-27 15:05:39 axel%pike.org Exp $
* $Id: ProcessorState.h,v 1.11 2001-03-06 00:12:28 Peter.VanderBeken%pandora.be Exp $
*/
@@ -49,7 +49,7 @@
/**
* Class used for keeping the current state of the XSL Processor
* @author <a href="mailto:kvisco@ziplink.net">Keith Visco</a>
* @version $Revision: 1.10 $ $Date: 2001-01-27 15:05:39 $
* @version $Revision: 1.11 $ $Date: 2001-03-06 00:12:28 $
**/
class ProcessorState : public ContextState {
@@ -264,6 +264,15 @@ public:
**/
void stripSpace(String& names);
/**
* Adds a document to set of loaded documents
**/
void addLoadedDocument(Document* doc, String& location);
/**
* Returns a loaded document given it's url. NULL if no such doc exists
**/
Document* getLoadedDocument(String& url);
//-------------------------------------/
//- Virtual Methods from ContextState -/
@@ -407,6 +416,11 @@ private:
* A set of all availabe templates
**/
NodeSet templates;
/**
* the set of loaded documents
**/
NamedMap loadedDocuments;
XSLTAction* currentAction;

View File

@@ -38,7 +38,7 @@
* Olivier Gerardin
* -- Changed behavior of passing parameters to templates
*
* $Id: XSLTProcessor.cpp,v 1.35 2001-03-02 03:40:48 axel%pike.org Exp $
* $Id: XSLTProcessor.cpp,v 1.36 2001-03-06 00:12:09 Peter.VanderBeken%pandora.be Exp $
*/
#include "XSLTProcessor.h"
@@ -53,7 +53,7 @@
/**
* XSLTProcessor is a class for Processing XSL stylesheets
* @author <a href="mailto:kvisco@ziplink.net">Keith Visco</a>
* @version $Revision: 1.35 $ $Date: 2001-03-02 03:40:48 $
* @version $Revision: 1.36 $ $Date: 2001-03-06 00:12:09 $
**/
/**
@@ -203,7 +203,7 @@ void XSLTProcessor::getHrefFromStylesheetPI(Document& xmlDocument, String& href)
parseStylesheetPI(data, type, tmpHref);
if ( XSL_MIME_TYPE.isEqual(type) ) {
href.clear();
href.append(tmpHref);
URIUtils::resolveHref(tmpHref, node->getBaseURI(), href);
}
}
}
@@ -276,10 +276,10 @@ void XSLTProcessor::parseStylesheetPI(String& data, String& type, String& href)
* resolving relative URIs
* @return the result tree.
**/
Document* XSLTProcessor::process(Document& xmlDocument, String& documentBase) {
Document* XSLTProcessor::process(Document& xmlDocument) {
//-- look for Stylesheet PI
Document xslDocument; //-- empty for now
return process(xmlDocument, xslDocument, documentBase);
return process(xmlDocument, xslDocument);
} //-- process
/**
@@ -289,10 +289,11 @@ Document* XSLTProcessor::process(Document& xmlDocument, String& documentBase) {
* @return the result tree.
**/
Document* XSLTProcessor::process
(istream& xmlInput, istream& xslInput, String& documentBase) {
(istream& xmlInput, String& xmlFilename,
istream& xslInput, String& xslFilename) {
//-- read in XML Document
XMLParser xmlParser;
Document* xmlDoc = xmlParser.parse(xmlInput);
Document* xmlDoc = xmlParser.parse(xmlInput, xmlFilename);
if (!xmlDoc) {
String err("error reading XML document: ");
err.append(xmlParser.getErrorString());
@@ -300,7 +301,7 @@ Document* XSLTProcessor::process
return 0;
}
//-- Read in XSL document
Document* xslDoc = xmlParser.parse(xslInput);
Document* xslDoc = xmlParser.parse(xslInput, xslFilename);
if (!xslDoc) {
String err("error reading XSL stylesheet document: ");
err.append(xmlParser.getErrorString());
@@ -308,7 +309,7 @@ Document* XSLTProcessor::process
delete xmlDoc;
return 0;
}
Document* result = process(*xmlDoc, *xslDoc, documentBase);
Document* result = process(*xmlDoc, *xslDoc);
delete xmlDoc;
delete xslDoc;
return result;
@@ -324,10 +325,10 @@ Document* XSLTProcessor::process
* resolving relative URIs
* @return the result tree.
**/
Document* XSLTProcessor::process(istream& xmlInput, String& documentBase) {
Document* XSLTProcessor::process(istream& xmlInput, String& xmlFilename) {
//-- read in XML Document
XMLParser xmlParser;
Document* xmlDoc = xmlParser.parse(xmlInput);
Document* xmlDoc = xmlParser.parse(xmlInput, xmlFilename);
if (!xmlDoc) {
String err("error reading XML document: ");
err.append(xmlParser.getErrorString());
@@ -338,10 +339,10 @@ Document* XSLTProcessor::process(istream& xmlInput, String& documentBase) {
String href;
String errMsg;
getHrefFromStylesheetPI(*xmlDoc, href);
istream* xslInput = URIUtils::getInputStream(href,documentBase,errMsg);
istream* xslInput = URIUtils::getInputStream(href,errMsg);
Document* xslDoc = 0;
if ( xslInput ) {
xslDoc = xmlParser.parse(*xslInput);
xslDoc = xmlParser.parse(*xslInput, href);
delete xslInput;
}
if (!xslDoc) {
@@ -351,7 +352,7 @@ Document* XSLTProcessor::process(istream& xmlInput, String& documentBase) {
delete xmlDoc;
return 0;
}
Document* result = process(*xmlDoc, *xslDoc, documentBase);
Document* result = process(*xmlDoc, *xslDoc);
delete xmlDoc;
delete xslDoc;
return result;
@@ -529,14 +530,14 @@ void XSLTProcessor::processTopLevel
* and returns the result tree
**/
Document* XSLTProcessor::process
(Document& xmlDocument, Document& xslDocument, String& documentBase)
(Document& xmlDocument, Document& xslDocument)
{
Document* result = new Document();
//-- create a new ProcessorState
ProcessorState ps(xslDocument, *result);
ps.setDocumentBase(documentBase);
ps.setDocumentBase(xslDocument.getBaseURI());
//-- add error observers
ListIterator* iter = errorObservers.iterator();
@@ -567,8 +568,7 @@ Document* XSLTProcessor::process
void XSLTProcessor::process
( Document& xmlDocument,
Document& xslDocument,
ostream& out,
String& documentBase )
ostream& out)
{
@@ -576,7 +576,7 @@ void XSLTProcessor::process
//-- create a new ProcessorState
ProcessorState ps(xslDocument, *result);
ps.setDocumentBase(documentBase);
ps.setDocumentBase(xslDocument.getBaseURI());
//-- add error observers
ListIterator* iter = errorObservers.iterator();
@@ -611,11 +611,11 @@ void XSLTProcessor::process
* will not close the ostream argument
**/
void XSLTProcessor::process
(istream& xmlInput, ostream& out, String& documentBase)
(istream& xmlInput, String& xmlFilename, ostream& out)
{
XMLParser xmlParser;
Document* xmlDoc = xmlParser.parse(xmlInput);
Document* xmlDoc = xmlParser.parse(xmlInput, xmlFilename);
if (!xmlDoc) {
String err("error reading XML document: ");
err.append(xmlParser.getErrorString());
@@ -626,10 +626,10 @@ void XSLTProcessor::process
String href;
String errMsg;
getHrefFromStylesheetPI(*xmlDoc, href);
istream* xslInput = URIUtils::getInputStream(href,documentBase,errMsg);
istream* xslInput = URIUtils::getInputStream(href,errMsg);
Document* xslDoc = 0;
if ( xslInput ) {
xslDoc = xmlParser.parse(*xslInput);
xslDoc = xmlParser.parse(*xslInput, href);
delete xslInput;
}
if (!xslDoc) {
@@ -639,7 +639,7 @@ void XSLTProcessor::process
delete xmlDoc;
return;
}
process(*xmlDoc, *xslDoc, out, documentBase);
process(*xmlDoc, *xslDoc, out);
delete xmlDoc;
delete xslDoc;
} //-- process
@@ -652,11 +652,13 @@ void XSLTProcessor::process
* will not close the ostream argument
**/
void XSLTProcessor::process
(istream& xmlInput, istream& xslInput, ostream& out, String& documentBase)
(istream& xmlInput, String& xmlFilename,
istream& xslInput, String& xslFilename,
ostream& out)
{
//-- read in XML Document
XMLParser xmlParser;
Document* xmlDoc = xmlParser.parse(xmlInput);
Document* xmlDoc = xmlParser.parse(xmlInput, xmlFilename);
if (!xmlDoc) {
String err("error reading XML document: ");
err.append(xmlParser.getErrorString());
@@ -664,7 +666,7 @@ void XSLTProcessor::process
return;
}
//-- read in XSL Document
Document* xslDoc = xmlParser.parse(xslInput);
Document* xslDoc = xmlParser.parse(xslInput, xslFilename);
if (!xslDoc) {
String err("error reading XSL stylesheet document: ");
err.append(xmlParser.getErrorString());
@@ -672,7 +674,7 @@ void XSLTProcessor::process
delete xmlDoc;
return;
}
process(*xmlDoc, *xslDoc, out, documentBase);
process(*xmlDoc, *xslDoc, out);
delete xmlDoc;
delete xslDoc;
} //-- process

View File

@@ -21,7 +21,7 @@
* Keith Visco, kvisco@ziplink.net
* -- original author.
*
* $Id: XSLTProcessor.h,v 1.13 2001-01-27 15:05:40 axel%pike.org Exp $
* $Id: XSLTProcessor.h,v 1.14 2001-03-06 00:12:21 Peter.VanderBeken%pandora.be Exp $
*/
@@ -75,7 +75,7 @@
/**
* A class for Processing XSL Stylesheets
* @author <a href="mailto:kvisco@ziplink.net">Keith Visco</a>
* @version $Revision: 1.13 $ $Date: 2001-01-27 15:05:40 $
* @version $Revision: 1.14 $ $Date: 2001-03-06 00:12:21 $
**/
class XSLTProcessor
#ifdef MOZ_XSL
@@ -140,11 +140,9 @@ public:
* will be retrieved from the XML Stylesheet Processing instruction,
* otherwise an empty document will be returned.
* @param xmlDocument the XML document to process
* @param documentBase the document base of the XML document, for
* resolving relative URIs
* @return the result tree.
**/
Document* process(Document& xmlDocument, String& documentBase);
Document* process(Document& xmlDocument);
#endif
@@ -154,7 +152,7 @@ public:
* @param documentBase the document base for resolving relative URIs.
**/
Document* process
(Document& xmlDocument, Document& xslDocument, String& documentBase);
(Document& xmlDocument, Document& xslDocument);
/**
* Reads an XML Document from the given XML input stream, and
@@ -163,8 +161,8 @@ public:
* @param documentBase the document base for resolving relative URIs.
* @return the result tree.
**/
Document* process(istream& xmlInput, istream& xslInput,
String& documentBase);
Document* process(istream& xmlInput, String& xmlFilename,
istream& xslInput, String& xslFilename);
#ifndef MOZ_XSL
/**
@@ -177,7 +175,7 @@ public:
* resolving relative URIs
* @return the result tree.
**/
Document* process(istream& xmlInput, String& documentBase);
Document* process(istream& xmlInput, String& xmlFilename);
//----------------------------------------------/
//-- Methods that print the result to a stream -/
@@ -191,7 +189,7 @@ public:
* The result tree is printed to the given ostream argument,
* will not close the ostream argument
**/
void process(istream& xmlInput, ostream& out, String& documentBase);
void process(istream& xmlInput, String& xmlFilename, ostream& out);
/**
* Processes the given XML Document using the given XSL document.
@@ -199,9 +197,8 @@ public:
* will not close the ostream argument
* @param documentBase the document base for resolving relative URIs.
**/
void process
(Document& xmlDocument, Document& xslDocument,
ostream& out, String& documentBase);
void process(Document& xmlDocument, Document& xslDocument,
ostream& out);
/**
* Reads an XML Document from the given XML input stream, and
@@ -211,8 +208,9 @@ public:
* will not close the ostream argument
* @param documentBase the document base for resolving relative URIs.
**/
void process(istream& xmlInput, istream& xslInput,
ostream& out, String& documentBase);
void process(istream& xmlInput, String& xmlFilename,
istream& xslInput, String& xslFilename,
ostream& out);
#endif