- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Fri, 08 Oct 2010 00:41:01 +0100
- To: Chimezie Ogbuji <ogbujic@ccf.org>
- CC: Steve Harris <steve.harris@garlik.com>, "public-rdf-dawg@w3.org Group" <public-rdf-dawg@w3.org>
On 07/10/10 20:46, Chimezie Ogbuji wrote:
> On 10/6/10 6:25 AM, "Andy Seaborne"<andy.seaborne@epimorphics.com> wrote:
>> The use of xml:base [1] applies to the XML element it is an attribute
>> of. In XML, and Turtle, the base URI can change during parsing.
>>
>> -------------
>> PUT /rdf-graphs/service/?graph=1 HTTP/1.1
>> Host: example.com
>>
>> <?xml version='1.0' encoding='UTF-8'?>
>> <rdf:RDF
>> xml:base='http://example2.com/rdf-graphs/employees/'
>> xmlns:rdf='...'>
>> ...
>> </rdf:RDF>
>> -------------
>>
>> Here, it starts as http://example.com/rdf-graphs/service/?graph=1, and
>> that is in-scope for determining ?graph=1. The base for the parsing of
>> the XML document (the external base):
>> http://example.com/rdf-graphs/service/?graph=1
>>
>> It changes inside rdf:RDF element to
>> http://example2.com/rdf-graphs/employees/
>>
>> I thing the graph to PUT to is http://example.com/rdf-graphs/service/1
>
> This is in conflict with my understanding of RFC3986 (in particular with the
> highest precedent: Base URI embedded in content). According to the chain,
> the base is given by the embedded xml:base attribute first.
We may be talking at cross purposes. The issue is a relative URI in the
HTTP request line.
The simple solution is to require the URI in ?graph= to be absolute. We
are defining the naming convention here so we can make that condition.
If we allow relative URIs:
The important point for me is that RFC 3986 describes a process in
section 5 that is applied when the relative URI is encountered.
I explain below why I think RFC 3986 describes a process to apply at the
point when a relative URI is found so if outside the XML document,
xml:base has not been encoutered and does not apply. I provide
supporting evidence for that view from the defn of xml:base and RFC 3986.
I don't understand how the scope of xml:base can be outside the XML
document, actually how it can be outside the rdf:RDF element for several
reasons:
1/ xml:base, by its definition, applies only to XML documents
2/ xml:base is scoped to the element where it occurs
3/ xml:base is itself subject to relative URI resolution so there is
base of wider scope than the XML document.
4/ An XML document can have several xml:base - if they apply outside
their element scope, which one applies?
(1) has a practical matter - the request should be able to be dispatched
within the web server before the content is parsed.
[[ http://www.w3.org/TR/xmlbase/#rfc3986
4.1 Relation to RFC 3986
...
1. The base URI is embedded in the document's content.
...
This document specifies the details of rule #1 for embedding base URI
information in the specific case of XML documents.
]]
The last part is significant. xml:base is specific to XML documents.
[[RFC 3986
Section 5:
5 Reference Resolution
This section defines the process of resolving a URI reference
within a context that allows relative references so that the result is a
string matching the <URI> syntax rule of Section 3.
]]
so we are talking about the process of resolution. That occurs when the
relative URI is encountered.
The diagram in RFC 3986 shows the nesting and shows the relative URI at
the center. When the relative URI is encountered, the parser (and RFC
3986 talks about parsers) picks the base URI working out from that diagram.
This is illustrated when xml:base is relative - it itself is resolved
using the current base at that point. There is base URI of wider scope
than the xml:base in the document.
[[RFC 3986 - 5.1 Establishing a Base URI
If the base URI is obtained from a URI reference, then that reference
must be converted to absolute form and stripped of any fragment
component prior to its use as a base URI.
]]
In RDF/XML:
Document base: http://example/A/
<rdf:RDF
xml:base="base1/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://example/">
=> base is now <http://example/A/base1> .
Let me work though the parsing process for the HTTP request:
PUT /rdf-graphs/service/?graph=1 HTTP/1.1
Host: example.com
so resolving "1" working outwards through that diagram, we get a base of
http://example.com/rdf-graphs/service/?graph=1.
It is also arguable that there no base URI (or it's the application
dependent one) at this point.
The base inside the XML content does not apply: it's not in context yet.
(This also follows in definition of xml:base as it applies to XML
documents.)
<?xml version='1.0' encoding='UTF-8'?>
** base URI is http://example.com/rdf-graphs/service/?graph=1
<rdf:RDF
**Base becomes 'http://example2.com/rdf-graphs/employees/'
xml:base='http://example2.com/rdf-graphs/employees/'
xmlns:rdf='...'>
At this point the base is that given by xml:base and by the xmlbase
spec, applies to the rdf:RDF only. Resolution of relative URIs in
xml:base provides evidence for this.
If the xml:base is itself relative:
[[ RFC 3986
If the base URI is obtained from a URI reference, then that reference
must be converted to absolute form and stripped of any fragment
component prior to its use as a base URI.
]]
For the ?graph=relURI, this leaves two possibilities:
1/ there is no base URI, and ?graph= can not be a relative URI.
2/ The base is URI used to retrieve the entity.
(1) is made by arguing that the base URI is the sum total of the request
line and HTTP headers and starts immediately at the end of the headers
and so is not active at the point ?graph=1 is encountered.
(2) is made by arguing that the base URI comes from the entity URI in
the request. It's still arguable if it is active by the time ?graph= is
reached or whether it starts at the end of the method line.
Andy
Received on Thursday, 7 October 2010 23:41:38 UTC