XInclude and XML Base
R. Alexander Milowski
milowski@sims.berkeley.edu
School of Information Management and Systems
#1
Base URIs
An XML document has a base uri.
Its value represents where the document came from.
These values propagate down to each element.
That allows relative URI links to work:
<graphic src='example.png'/> <next href='slide2.xml'/> <top href='../index.xml'/>
#2
Unknown Base URI
Not all documents have a base URI.
What happens when you POST an XML document? There is no URI for the client...
What happens in a pipeline when you chain two XSLT stylesheets together? The first result has no URI...
This means that documents can be broken after you author them.
This link to 'bio.xml' has no resolveable URI under HTTP POST:
<person bio="bio.xml"> <name>Alex Milowski</name> </person>
#3
IETF RFC 2398
This RFC provides the means for embedding base URIs in documents.
There are rules for determining the base URI:
The base URI is embedded in the document's content.
The base URI is that of the encapsulating entity (message, document, or none).
The base URI is the URI used to retrieve the entity.
The base URI is defined by the context of the application.
There is a W3C Recommendation called XML Base that covers (1).
#4
xml:base Attribute
The xml:base attribute annotates an element with a base URI value.
Example:
<graphic xml:base='http://www.milowski.com/thesis/' src='issac-scarfex.jpg'/>
Rules for the base URI of an element:
The value of the xml:base attribute.
The base URI of the parent element if there is a parent element.
The base URI of the document.
Keep in mind that the 'xml' prefix is pre-defined to be 'http://www.w3.org/XML/1998/namespace'.
#5
Interpreting Values
For any attribute, use the base URI of the element.
<link href='mystuff.xml'/>
For any text content, use the base URI of the parent element.
<link>mystuff.xml</link>
For xml:base, use the base URI of the parent element.
<p xml:base="http://www.example.com"> A <a xml:base="/bingo/" href='stuff.xml'>link</a> </p>
In the first case, the base URI of 'p' is used but not needed.
In the second case, the base URI of 'a' is used--which was inherited from 'p'.
#6
Including Text/Modules
Sometimes you just want to define reuseable "text".
Other times you want re-useable content modules.
XInclude defines a way to do both.
This is a "replacement" for general entities (e.g. &mystuff;).
#7
XInclude
XInclude is a "Candidate Recommendation" (see http://www.w3.org/TR/xinclude/).
This means it is "almost done" in W3C terms.
XInclude is a vocabulary that tells a processor how to transform your document.
The] vocabulary has replacement semantics (e.g. replace this xinclude with the specified text/module).
#8
Including External Content
Just point to the content:
<doc xmlns:xi="http://www.w3.org/2001/XInclude"> <title>My Document</title> <xi:include href='abstract.xml'/> </doc>
'abstract.xml' contains:
<abstract> <p>Blah, blah, blah,...</p> </abstract>
So you get:
<doc xmlns:xi="http://www.w3.org/2001/XInclude"> <title>My Document</title> <abstract> <p>Blah, blah, blah,...</p> </abstract> </doc>
#9
Including Internal Content
Just point to the content:
<doc xmlns:xi="http://www.w3.org/2001/XInclude"> <string id="cde">Center for Document Engineering</string> <title>Where I Work</title> <p>I teach at the <xi:include xpointer="id('cde')"/>.</p> </doc>
So you get:
<doc xmlns:xi="http://www.w3.org/2001/XInclude"> <string id="cde">Center for Document Engineering</string> <title>Where I Work</title> <p>I teach at the Center for Document Engineering.</p> </doc>
#10
Inclusion Chains
You can't have circular includes (e.g. A includes B and B includes A).
Inclusion chains are followed:
<doc xmlns:xi="http://www.w3.org/2001/XInclude"> <title>My Document</title> <xi:include href='abstract.xml'/> </doc>
'abstract.xml' contains:
<abstract> <string id="b">blah</string> <p><xi:include xpointer="id('b')"/>, <xi:include xpointer="id('b')"/>, <xi:include xpointer="id('b')"/>,...</p> </abstract>
So you get:
<doc xmlns:xi="http://www.w3.org/2001/XInclude"> <title>My Document</title> <abstract> <string id="b">blah</string> <p>blah, blah, blah,...</p> </abstract> </doc>