You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by Joe Gregorio <jo...@mts.com> on 2000/01/28 05:37:45 UTC
PATCH - For Xerces and Xalan
I recently did a full checkout of xml-xerces and xml-xalan and found
that they did not work together fresh out of CVS. (They initially wouldn't
even compile, thanks David_N_Bertoni@lotus.com for the quick
commits to get past that problem). Now they compile but TestXSLT would fail
on the supplied examples.
I think I have tracked down all the problems and have supplied patches for both xerces and
xalan.
=======================================================
This first patch is for XSLT/XSLTEngineImpl.cpp and
changes XSLTEngineImpl::getURLFromString() so it doesn't depend
upon XMLURL throwing an exception when given a urlString with
no protocol in it (which it does not appear to do). Now it checks
for XMLURL::Unknown for the protocol and then tries
fully qualiying the path and prepending "file:///" and trying
again.
=======================================================
--- xsltengineimpl.orig.cpp Thu Jan 27 22:58:36 2000
+++ xsltengineimpl.cpp Thu Jan 27 22:50:24 2000
@@ -3744,28 +3744,23 @@
XSLTEngineImpl::getURLFromString (const DOMString& urlString) const
{
std::auto_ptr<XMLURL> url(new XMLURL);
-
- try
- {
+
+ try {
url->setURL(c_wstr(urlString));
- }
- // 'urlString' not a valid url, try to construct a file url
- catch (const MalformedURLException&)
- {
- DOMString fullpath("file:///");
+ if (XMLURL::Unknown == url->getProtocol()) {
+ DOMString fullpath("file:///");
- try
- {
-// XMLCh* lastPart = XMLPlatformUtils::getBasePath(c_wstr(urlString));
-// fullpath += lastPart;
- fullpath += urlString;
+ XMLCh* lastPart = XMLPlatformUtils::getFullPath(c_wstr(urlString));
+ fullpath += lastPart;
url->setURL(c_wstr(fullpath));
}
- catch (MalformedURLException& e2)
- {
- diag("Error! Cannot create url for: " + fullpath);
+ }
+
+ // 'urlString' not a valid url, try to construct a file url
+ catch (const MalformedURLException& e2)
+ {
+ diag("Error! Cannot create url for: " + urlString);
throw e2;
- }
}
return url.release();
=======================================================
This next patch is for TestXSLT/process.cpp. If you passed
in "fred.xml" as the inFileName then XSLTInputSource
wouldn't know the context. The calls to getURLFromString
and assignment to XMLURL transform "fred.xml" to "file:///c:\user\barney\fred.xml"
The only kludgey thing about this is the calling of process.getURLFromString().
Maybe getURLFromString could be moved to a stand alone function?
=======================================================
--- process.orig.cpp Thu Jan 27 22:58:24 2000
+++ process.cpp Thu Jan 27 22:50:52 2000
@@ -393,7 +393,11 @@
FormatterListener* formatter = 0;
assert(inFileName.length());
- XSLTInputSource theInputSource(c_wstr(inFileName));
+
+ std::auto_ptr<XMLURL> url(processor.getURLFromString(c_wstr(inFileName)));
+ assert(url.get() != 0);
+
+ XSLTInputSource theInputSource(url->getURLText(), 0);
DOM_Node sourceTree = processor.getSourceTreeFromInput(&theInputSource);
/*
=======================================================
This patch is for XMLURL.cpp. It is possible to have
fHost == 0 and baseURL.fHost == 0 legally if
fProtocol is XMLURL::File.
=======================================================
--- xmlurl.orig.cpp Thu Jan 27 23:04:52 2000
+++ xmlurl.cpp Thu Jan 27 23:05:02 2000
@@ -691,9 +691,12 @@
return;
fProtocol = baseURL.fProtocol;
- if (fHost || !baseURL.fHost)
- return;
- fHost = XMLString::replicate(baseURL.fHost);
+ if (File != fProtocol) {
+ if (fHost || !baseURL.fHost)
+ return;
+ fHost = XMLString::replicate(baseURL.fHost);
+ }
+
if (baseURL.fUser)
fUser = XMLString::replicate(baseURL.fUser);
if (baseURL.fPassword)
---------------------------------------
Joe Gregorio MTS System Corp
Program Manager www.mts.com