The attached patch:

  xml.sax.expatreader.patch

... adds functionality to the xml.sax package.

Normally, an application program, which imports xml.sax, subclasses
xml.sax.handler.EntityResolver to define the resolveEntity method.  It
passes an instance of the class to the parser.  Then the parser
invokes the user-defined method when it needs it.

This patch alters the parser to invoke, instead, a new method called
resolveEntity2.  The parser passes a new parameter (called basePath)
to resolveEntity2.  This is in addition to the publicId and systemId
parameters traditionally passed to resolveEntity.

... and it is handy because relative xml system IDs (i.e., local
directory paths) are relative to the file that defines them, not the
file that references them.  Unless you have an idea where the systemId
was defined (i.e., basePath), you may not be able to resolve it.

Here is an example:

  class cEnts(xml.sax.handler.EntityResolver):
    def resolveEntity2(self,aPublicId,aSystemId,aBasePath=None):
	global DOCUMENT_HOME
        if aSystemId.lower().startswith("file://"):
            aSystemId=aSystemId[7:]
        if aBase==None:
            aBase=DOCUMENT_HOME
        __Path=os.path.dirname(aBasePath)
        aSystemId=os.path.join(__Path,aSystemId)
        return xml.sax.handler.EntityResolver.resolveEntity(self,
            aPublicId,aSystemId)

[Please forgive obvious misinterpretations of what xml System IDs are
all about.  I am new to this.]

If basePath is None, then the systemId is defined at the top level of
the xml document, and you should know how to resolve it.

The parser invokes either the new method, resolveEntity2, or the old
method, resolveEntity, so you should define one or the other.  If you
define the new method, resolveEntity2, the parser will invoke it
preferentially, but, if you don't define it, the parser will try to
invoke resolveEntity as documented by xml.sax.

The patch is against PyXML 0.8.3.  To apply the patch:

  cd /usr/lib/python2.3/site-packages/_xmlplus/sax
  patch -Nb -i ~/xml.sax.expatreader.patch

The patch also works against Python 2.3.3 and Python 2.3.2:

  cd /usr/lib/python2.3/xml/sax
  patch -Nb -i ~/xml.sax.expatreader.patch

[I think it's just that simple.  -ccr-]