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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -71,7 +71,7 @@ EXPORTS = \
|
||||
$(NULL)
|
||||
|
||||
LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I..\..\..\base -I..\..\dom \
|
||||
-I..\..
|
||||
-I..\.. -I..\..\..\net
|
||||
|
||||
LCFLAGS = \
|
||||
$(LCFLAGS) \
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user