xml:base handling of relative URIs

A bug in several RDF/XML parsers' interpretations of xml:base
recently came to light [1].  The bug had to do with failure to
interpret nested xml:base attributes correctly; in particular,
the XML Base Recommendation allows an xml:base attribute
to contain a relative URI which is then interpreted in the context
of the base URI of the parent element [3].

   [1] http://lists.w3.org/Archives/Public/semantic-web/2005Jul/0040.html
   [2] http://www.w3.org/TR/xmlbase/
   [3] http://www.w3.org/TR/xmlbase/#matching

The test case in the bug report [1] reveals that several RDF/XML
parsers fail to correctly resolve such nested xml:base attributes.

Running this test through cwm reveals that cwm (rev 1.162,
xml2rdf.py rev 1.20, xmllib rev 1.2, sax2rdf.py rev 1.42) does not
even permit relative URIs in xml:base:

% cwm --rdf << EOF
? <?xml version="1.0"?>
? <rdf:RDF xml:base="http://example.org/"
?          xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
?          xmlns:dc="http://purl.org/dc/elements/1.1/">
?  <rdf:Description rdf:about="http://www.w3.org/" xml:base="test1/">
?    <dc:title>World Wide Web Consortium</dc:title>
?    <dc:source rdf:resource="test2/"/>
?    <dc:relation rdf:resource=""/>
?  </rdf:Description>
? </rdf:RDF>
? EOF
Traceback (most recent call last):
  File "/home/swick/pub/2000/10/swap/cwm.py", line 635, in ?
    doCommand()
  File "/home/swick/pub/2000/10/swap/cwm.py", line 366, in doCommand
    why = becauseCwm)
  File "/afs/w3.org/pub/WWW/2000/10/swap/llyn.py", line 1152, in load
    referer=referer, why=why)  
  File "/afs/w3.org/pub/WWW/2000/10/swap/webAccess.py", line 127, in load
    p.feed(buffer)
  File "/afs/w3.org/pub/WWW/2000/10/swap/sax2rdf.py", line 643, in feed
    self._p.feed(data)
  File "/usr/lib/python2.2/site-packages/_xmlplus/sax/expatreader.py", line 216, in feed
    self._parser.Parse(data, isFinal)
  File "/usr/lib/python2.2/site-packages/_xmlplus/sax/expatreader.py", line 353, in start_element_ns
    AttributesNSImpl(newattrs, qnames))
  File "/afs/w3.org/pub/WWW/2000/10/swap/sax2rdf.py", line 450, in startElementNS
    x = self.sink.newSymbol(self.uriref(value)) 
  File "/afs/w3.org/pub/WWW/2000/10/swap/sax2rdf.py", line 156, in uriref
    return uripath.join(self._base, str)
  File "/afs/w3.org/pub/WWW/2000/10/swap/uripath.py", line 106, in join
    assert(bcolonl >= 0), "Base uri '%s' is not absolute" % here # else it's not absolute
AssertionError: Base uri 'test1/' is not absolute
% 

Received on Friday, 22 July 2005 14:34:25 UTC