<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification::19971229//EN" "xmlspec.dtd" [
<!--ArborText, Inc., 1988-1997, v.4001-->
<!ENTITY iso6.doc.date "19980303">
<!ENTITY doc-type "WD-xptr">
]>
<?Pub UDT _bookmark _target?>
<?Pub Inc?>
<spec>
<!-- Last edited: 3 March 1998 by sjd/elm-->
<header>
<title>XML Pointer Language (XPointer)</title>
<version>Version 1.0</version>
<w3c-designation>&doc-type;-&iso6.doc.date;</w3c-designation>
<w3c-doctype>World Wide Web Consortium Working Draft</w3c-doctype>
<pubdate><day>03</day><month>March</month><year>1998</year></pubdate>
<notice>
<p>This draft is for public discussion.</p>
</notice>
<publoc><loc href="http://www.w3.org/TR/&doc-type;-&iso6.doc.date;">http://www.w3.org/TR/&doc-type;-&iso6.doc.date;</loc>
</publoc>
<prevlocs><loc href="http://www.w3.org/TR/WD-xml-link-970731">http://www.w3.org/TR/WD-xml-link-970731
</loc></prevlocs>
<latestloc><loc href="http://www.w3.org/TR/&doc-type;">http://www.w3.org/TR/&doc-type;<?Pub Caret?></loc>
</latestloc>
<authlist>
<author><name>Eve Maler</name><affiliation>ArborText</affiliation><email href="mailto:elm@arbortext.com">
elm@arbortext.com</email></author>
<author><name>Steve DeRose</name><affiliation>Inso Corp. and Brown University
</affiliation><email href="sderose@eps.inso.com">sderose@eps.inso.com</email>
</author>
<!-- how shall we cite Tim? sjd What about with an Acknowledgments section?
-elm <AUTHOR> <NAME>Tim Bray</NAME> <AFFILIATION>Textuality</AFFILIATION>
<EMAIL>tbray@textuality.com</EMAIL> </AUTHOR>-->
</authlist>
<status>
<statusp>This is a W3C Working Draft for review by W3C members and other interested
parties. It is a draft document and may be updated, replaced, or obsoleted
by other documents at any time. It is inappropriate to use W3C Working Drafts
as reference material or to cite them as other than "work in progress". A
list of current W3C working drafts can be found at <loc href="http://www.w3.org/TR">
http://www.w3.org/TR</loc>.</statusp>
<statusp>This work is part of the W3C XML Activity (for current status, see <loc
href="http://www.w3.org/MarkUp/SGML/Activity">http://www.w3.org/MarkUp/XML/Activity
</loc>). For information about the XLink language in which XPointer is expected
to be used, see <loc href="http://www.w3.org/MarkUp/SGML/Activity">http://www.w3.org/TR/WD-xlink
</loc>.</statusp>
<statusp>See <loc href="http://www.w3.org/TR/NOTE-xlink-principles">http://www.w3.org/TR/NOTE-xlink-principles
</loc>          for additional background on the design principles informing
XPointer.</statusp>
</status>
<abstract>
<p>This document specifies constructs that support addressing into the internal
structures of XML documents. In particular, it provides for specific reference
to elements, character strings, and other parts of XML documents, whether
or not they bear an explicit ID attribute.</p>
</abstract>
<pubstmt>
<p>Burlington, Seekonk, et al.: World-Wide Web Consortium, XML Working Group,
1998.</p>
</pubstmt>
<sourcedesc>
<p>Created in electronic form.</p>
</sourcedesc>
<langusage>
<language id="en">English</language>
<language id="ebnf">Extended Backus-Naur Form (formal grammar)</language>
</langusage>
<revisiondesc>
<slist>
<sitem>1997-01-15 : Skeleton draft by TB</sitem>
<sitem>1997-01-24 : Fleshed out by sjd</sitem>
<sitem>1997-04-08 : Substantive draft</sitem>
<sitem>1997-06-30 : Public draft</sitem>
<sitem>1997-08-01 : Public draft</sitem>
<sitem>1997-08-05 : Prose/organization work by sjd</sitem>
<sitem>1997-10-14: Conformance and design principles; a bit of cleanup by
elm</sitem>
<sitem>1997-11-07: Update for editorial issues per issues doc, by sjd.</sitem>
<sitem>1997-12-01: Update for editorial issues per issues doc in preparation
for F2F meeting, by sjd.</sitem>
<sitem>1998-01-13: Editorial cleanup, addition of new design principles, by
elm.</sitem>
<sitem>1998-02-27: Splitting out of XLink and XPointer; span syntax changes;
dots between location terms; other issue cleanup; by elm.</sitem>
<sitem>1998-03-02: Review and fix remaining details from split. sjd/elm</sitem>
</slist>
</revisiondesc></header>
<body>
<div1>
<head>Introduction</head>
<p>This document specifies a language that supports addressing into the internal
structures of XML documents. In particular, it provides for specific reference
to elements, character strings, and other parts of XML documents, whether
or not they bear an explicit ID attribute.</p>
<div2>
<head><?Pub Dtl?>Language Design Goals</head>
<p>Following is a summary of the design principles governing XPointer:<olist>
<item><p>XPointers shall address into XML documents.</p></item>
<item><p>XPointers shall be straightforwardly usable over the Internet.</p>
</item>
<item><p>XPointers shall be straightforwardly usable in URIs.</p></item>
<item><p>The XPointer design shall be prepared quickly.</p></item>
<item><p>The XPointer design shall be formal and concise.</p></item>
<item><p>The XPointer syntax shall be reasonably compact and human readable.
</p></item>
<item><p>XPointers shall be optimized for usability.</p></item>
<item><p>XPointers must be feasible to implement.</p></item>
</olist></p>
</div2>
<div2>
<head><?Pub Dtl?>Relationship to Existing Standards</head>
<p>Three standards have been especially influential: <ulist>
<item><p><emph>HTML:</emph> Has popularized an important location specifier
type, the URL (now URI).</p></item>
<item><p><emph>HyTime:</emph>Defines location specifier types for all kinds
of data.</p></item>
<item><p><emph>Text Encoding Initiative Guidelines (TEI P3):</emph> Provide
a formal syntax for location specifiers for structured data, graphics, and
other data.</p></item>
</ulist></p>
<p>Many other linking systems have also informed this design, especially Dexter,
FRESS, MicroCosm, and InterMedia.</p>
</div2>
<div2>
<head><?Pub Dtl?>Terminology</head>
<p>The following basic terms apply in this document.    <glist>
<!--Define designated resource here as well as in XLink; it goes hand in hand with sub-resource. -elm-->
<gitem><label><termdef id="dt-eltree" term="Element Tree">element tree</termdef></label>
<def>
<p>An abstract representation of the relevant structure specified by the tags,
attributes, and other markup constructs in an XML document.</p>
</def></gitem>
<gitem><label><termdef id="dt-link" term="Link">link</termdef></label>
<def>
<p>An explicit relationship between two or more data objects or portions of
data objects.</p>
</def></gitem>
<gitem><label><termdef id="dt-linkel" term="Linking Element">linking element
</termdef></label>
<def>
<p>An <xtermref href="WD-xml-lang.html#dt-element">element</xtermref> that
asserts the existence and describes the characteristics of a <termref def="dt-link">
link</termref>.</p>
</def></gitem>
<gitem><label><termdef id="dt-locator" term="Locator">locator</termdef></label>
<def>
<p>Data, provided as part of a link, which identifies a <termref def="dt-resource">
resource</termref>.</p>
</def></gitem>
<gitem><label><termdef id="dt-resource" term="Resource">resource</termdef></label>
<def>
<p>In the abstract sense, an addressable unit of information or service that
is participating in a <termref def="dt-link">link</termref>. Examples include
files, images, documents, programs, and query results. Concretely, anything
reachable by the use of a <termref def="dt-locator">locator</termref> in some <termref
def="dt-linkel">linking element</termref>. Note that this term and its definition
are taken from the basic specifications governing the World Wide Web.   
<!--Joel notes: need link here.-->
</p>
</def></gitem>
<gitem><label><termdef id="dt-subresource" term="sub-Resource">sub-resource
</termdef></label>
<def>
<p>A portion of a resource, pointed to as the precise destination of a link.
As one example, a link might specify that an entire document be retrieved
and displayed, but that some specific part(s) of it is the specific linked
data, to be treated in an application-appropriate manner such as indication
by highlighting, scrolling, etc.</p>
</def></gitem>
</glist></p>
</div2>
<div2>
<head><?Pub Dtl?>Notation</head>
<p>The formal grammar for <termref def="dt-locator">locators</termref> is
given using a simple Extended Backus-Naur Form (EBNF) location, as described
in <xspecref href="http://www.w3.org/TR/WD-xml-lang.html#sec-notation">the
XML specification</xspecref>.</p>
</div2>
</div1>
<div1>
<head>XPointers in Locators</head>
<p>The locator for a <termref def="dt-resource">resource</termref> is typically
provided by means of a Uniform Resource Identifier, or URI. XPointers can
be used as fragment identifiers in conjunction with the URI structure to specify
a more precise sub-resource. Any fragment identifier that points into an XML
resource must be an <termref def="dt-xpointer">XPointer</termref>. However,
for any locator in an XML resource that identifies a resource that is not
an <xtermref href="WD-xml-lang.html#dt-xml-doc">XML document</xtermref> (for
example, an HTML or PDF document), XPointer does not constrain the syntax
or semantics of the locator.</p>
</div1>
<div1>
<head>The XPointer Language</head>
<p>XPointers operate on the <termref def="dt-eltree">tree</termref> defined
by the elements and other markup constructs of an XML document.</p>
<p><termdef id="dt-xpointer" term="XPointer">An <term>XPointer</term> consists
of a series of <termref def="dt-locterm">location terms</termref>, each of
which specifies a location, usually relative to the location specified by
the prior location term.</termdef> Each location term has a keyword (such
as <code>id</code>, <code>child</code>, <code>ancestor</code>, and so on)
and can have arguments such as an instance number, element type, or attribute.
For example, the location term <code>child(2,CHAP)</code> refers to the second
child element whose type is <code>CHAP</code>.</p>
<div2>
<head><?Pub Dtl?>XPointer Structure</head>
<p><termdef id="dt-locterm" term="Location Term">At the heart of the XPointer
is the <term>location term</term>, the basic unit of addressing information.
The combination of location terms in an XPointer has the effect of specifying
a precise location.</termdef><scrap id="xpointer" lang="ebnf">
<head>XPointer</head>
<prod id="nt-xpointer">
<lhs>XPointer </lhs><rhs><nt def="nt-absterm">AbsTerm</nt> '.' <nt def="nt-otherterms">
OtherTerms</nt></rhs>
<rhs>| <nt def="nt-absterm">AbsTerm</nt></rhs>
<rhs>| <nt def="nt-otherterms">OtherTerms</nt></rhs>
</prod>
<prod id="nt-otherterms">
<lhs>OtherTerms</lhs><rhs><nt def="nt-otherterm">OtherTerm</nt></rhs>
<rhs>| <nt def="nt-otherterm">OtherTerm</nt> '.' <nt def="nt-otherterm">OtherTerm
</nt></rhs>
</prod>
<prod id="nt-otherterm">
<lhs>OtherTerm</lhs><rhs><nt def="nt-relterm">RelTerm</nt></rhs>
<rhs>| <nt def="nt-spanterm">SpanTerm</nt></rhs>
<rhs>| <nt def="nt-attrterm">AttrTerm</nt></rhs>
<rhs>| <nt def="nt-stringterm">StringTerm</nt></rhs>
</prod>
</scrap></p>
<p><termdef id="dt-spanning" term="Spanning XPointer">
<!--Eventually, explain effect of and constraints on each pairing of non-absolute keywords. E.g., what do you do with attr(...).string(...)?-->
Many XPointers locate individual nodes in an element tree. However, some location
terms can locate more complex sets of data. For example, a string match may
locate only a portion of a node, and an XPointer containing the <code>span
</code> location term (called a <term>spanning XPointer</term>) can reference
sub-resources that do not constitute whole elements.</termdef></p>
<p>Note that the implementation of traversal to a resource is not constrained
by this specification. In particular, handling a resource designated by a
span is probably highly application-dependent. In a display-oriented application
program, such traversal might simply highlight the designated characters;
but a structure-oriented viewer might have no interest in sub-resources that
are not complete nodes or subtrees. Note that a span cannot be treated as
a set or list of elements, because spans may locate partial elements.</p>
<p>Location terms are classified into absolute terms, relative terms, span
terms, attribute terms, and string data terms. An absolute term selects one
or more elements or locations in an XML document without reference to any
other sub-resource location. <termdef id="dt-locsrc" term="Location Source">
A relative or string data term specifes a location in terms of another location,
called the <term>location source</term>. The location source is the entire
resource if there are no preceding location terms; otherwise it is the location
specified by the preceding term (which might be relative to a location term
before that).</termdef> </p>
</div2>
<div2>
<head><?Pub Dtl?>Absolute Location Terms</head>
<p>The keywords described in this section do not depend on the existence of
a location source. They can be used to establish a location source or can
serve as self-contained XPointers. <scrap id="absterms" lang="ebnf">
<head>Absolute location terms</head>
<prod id="nt-absterm">
<lhs>AbsTerm</lhs><rhs>'root()' | 'origin()' | <nt def="nt-idloc">IdLoc</nt>
| <nt def="nt-html">HTMLAddr</nt></rhs>
</prod>
<prod id="nt-idloc">
<lhs>IdLoc</lhs><rhs>'id(' <xnt href="WD-xml-lang.html#NT-Name">Name</xnt>
')'</rhs>
</prod>
<prod id="nt-html">
<lhs>HTMLAddr</lhs><rhs>'html(' <xnt href="WD-xml-lang.html#NT-SkipLit">SkipLit
</xnt> ')'</rhs>
</prod>
</scrap></p>
<p>The empty parentheses after <code>root</code> and <code>origin</code> are
for consistency with other keywords and to avoid ambiguous interpretation
of an XPointer containing just the string "root" or "origin".</p>
<div3>
<head>The root Keyword</head>
<p>If an XPointer begins with <code>root()</code>, the location source is
the <xtermref href="WD-xml-lang#dt-root">root element</xtermref> of the containing
resource. If an XPointer omits any leading absolute location term (that is,
it consists only of <nt def="nt-otherterms">OtherTerms</nt>), it is assumed
to have a leading <code>root()</code> absolute location term.</p>
</div3>
<div3>
<head>The origin Keyword</head>
<p>The <code>origin</code> keyword produces a meaningful location source for
any following location terms only if the XPointer is being processed by application
software in response to a request for <xspecref href="http://www.w3.org/TR/WD-xlink#dt-traversal">
traversal</xspecref> such as defined in the XLink specification. If an XPointer
begins with <code>origin()</code>, the location source is the sub-resource
from which the user initiated traversal rather than the default root element.
This allows XPointers to select abstract items such as "the next chapter".
</p>
<p>It is an error to use <code>origin()</code> in a locator where a URI is
also provided and identifies a containing resource different from the resource
from which traversal was initiated.</p>
<!--Given how big docs are usually broken up on the web, this may argue for having
a way to indirect off the URI of the document in which traversal starts; like chopping off the last
directory-name component or something, or referring explicitly to the BASE value, or... -sjd-->
</div3>
<div3>
<head>The id Keyword</head>
<p>If an XPointer begins with <code>id(Name)</code>, the location source is
the element in the containing resource with an attribute having a declared
type of <code>ID</code> and a value matching the given <xnt href="WD-xml-lang.html#NT-Name">
Name</xnt>.</p>
<p>For example, the location term <code>id(a27)</code> chooses the necessarily
unique element of the containing resource which has an attribute declared
to be of type <code>ID</code> whose value is <code>a27</code>.</p>
<p>Note that if an XML document does not declare all attributes whose values
are intended to serve as unique IDs, application software cannot reliably
distinguish ID attributes from others with the same string value. Application
software processing an XPointer must first attempt to locate an element with
a declared ID attribute whose value matches that <xnt href="WD-xml-lang.html#NT-Name">
Name</xnt> argument. If unable to do so, at user option   
<!--Link to definition of at user option-->
the application software may locate any element having an attribute with the
desired value.   
<!--This may mean we should think about giving a way to restrict ID() to only look on elements of given GI, and on given attributes. That would also let us pitch html(). Or, we could point out how to do all this with DESCENDANT and leave it at that.-->
</p>
</div3>
<div3>
<head>The html Keyword</head>
<p>If an XPointer begins with <code>html(NAMEVALUE)</code>, the location source
is the first element whose type is <code>A</code> and which has an attribute
called <code>NAME</code> whose value is the same as the supplied <code>NAMEVALUE
</code>. This is exactly the function performed by the "<code>#</code>" fragment
identifier in the context of an HTML document.   
<!--Except for case sensitivity... -elm-->
</p>
</div3>
</div2>
<div2>
<head><?Pub Dtl?>Relative Location Terms</head>
<p>The keywords described in this section depend on the existence of a <termref
def="dt-locterm">location source</termref>. If none is explicitly provided,
the location source is the root element of the containing resource. These
location terms provide facilities for navigating forward, backward, up, and
down through the element tree. These location terms all accept the same list
of arguments.<scrap id="locterm" lang="ebnf">
<head>Relative location terms</head>
<prod id="nt-relterm">
<lhs>RelTerm</lhs><rhs><nt def="nt-keyword">Keyword</nt>? <nt def="nt-args">
Arguments</nt></rhs>
</prod>
<prod id="nt-keyword">
<lhs>Keyword</lhs><rhs>'child'</rhs>
<rhs>| 'descendant'</rhs>
<rhs>| 'ancestor'</rhs>
<rhs>| 'preceding'</rhs>
<rhs>| 'following'</rhs>
<rhs>| 'psibling'</rhs>
<rhs>| 'fsibling' </rhs>
</prod>
</scrap></p>
<p><termdef id="dt-candidates" term="Candidates">Each of these keywords identifies
a sequence of elements or other XML node types from which the resulting location
source will be chosen. The arguments passed to the keyword determine which
node types from that sequence are in fact chosen.</termdef> Each keyword summarized
here is described in detail in the following sections.   
<!-- Insert tree diagram
and/or concentric-rectangles graphic here.-->
<glist>
<gitem><label><code>child</code></label>
<def>
<p>Identifies direct child nodes of the location source.</p>
</def></gitem>
<gitem><label><code>descendant</code></label>
<def>
<p>Identifies nodes appearing anywhere within the content of the location
source.</p>
</def></gitem>
<gitem><label><code>ancestor</code></label>
<def>
<p>Identifies element nodes containing the location source.</p>
</def></gitem>
<gitem><label><code>preceding</code></label>
<def>
<p>Identifies nodes that appear before (preceding) the location source.</p>
</def></gitem>
<gitem><label><code>following</code></label>
<def>
<p>Identifies nodes that appear after (following) the location source.</p>
</def></gitem>
<gitem><label><code>psibling</code></label>
<def>
<p>Identifies sibling nodes (sharing their parent with the location source)
that appear before (preceding) the location source.</p>
</def></gitem>
<gitem><label><code>fsibling</code></label>
<def>
<p>Identifies sibling nodes (sharing their parent with the location source)
that appear after (following) the location source.</p>
</def></gitem>
</glist></p>
<p>If the keyword is omitted, it is treated as equivalent to the immediately
preceding keyword; the keyword must not be omitted from the first location
term of any XPointer (including embedded ones). For example, the following
two XPointers are equivalent: <eg>child(2,SECTION).(1,SUBSECTION)</eg><eg>
child(2,SECTION).child(1,SUBSECTION)</eg></p>
<div3>
<head>Relative Location Term Arguments</head>
<p>All relative location terms operate using the same set of potential arguments: <scrap
id="steps" lang="ebnf">
<head>Relative location term arguments</head>
<prod id="nt-args">
<lhs>Arguments</lhs><rhs>'(' <nt def="nt-instanceorall">InstanceOrAll</nt></rhs>
<rhs>(',' <nt def="nt-nodetype">NodeType</nt></rhs>
<rhs>(',' <nt def="nt-attr">Attr</nt> ',' <nt def="nt-val">Val</nt>)*)? ')'
</rhs>
</prod>
</scrap></p>
</div3>
<div3>
<head>Selection by Instance Number</head>
<p>Elements and other node types can be selected by occurrence number: <scrap
id="instance" lang="ebnf">
<head>Instance</head>
<prod id="nt-instanceorall">
<lhs>InstanceOrAll</lhs><rhs>'all' | <nt def="nt-instance">Instance</nt></rhs>
</prod>
<prod id="nt-instance">
<lhs>Instance</lhs><rhs>('+' | '-')? [1-9] <xnt href="WD-xml-lang.html#NT-Digit">
Digit</xnt>*</rhs>
</prod>
</scrap></p>
<p>For a positive instance number <emph>n</emph>, the <emph>n</emph>th of
the <termref def="dt-candidates">candidate locations is identified</termref>.
For a negative instance number, the candidate locations are counted from last
to first (in a manner that is specific to each keyword). If the instance value <code>
all</code> is given, then all the candidate locations are selected. Numbers
that are out of range cause the XPointer to fail.</p>
</div3>
<div3>
<head>Selection by Node Type</head>
<p>XML sub-resources can be selected by specific node type as well as number: <scrap
id="nodetype" lang="ebnf">
<head>Node type</head>
<prod id="nt-nodetype">
<lhs>NodeType</lhs><rhs><xnt href="WD-xml-lang.html#NT-Name">Name</xnt></rhs>
<rhs>| '#element'</rhs>
<rhs>| '#pi'</rhs>
<rhs>| '#comment'</rhs>
<rhs>| '#text'</rhs>
<rhs>| '#cdata'</rhs>
<rhs>| '#all'</rhs>
</prod>
</scrap></p>
<p>The node type may be specified by one of the following values:<glist>
<gitem><label><xnt href="WD-xml-lang.html#NT-Name">Name</xnt></label>
<def>
<p>Selects a particular XML <xtermref href="WD-xml-lang.html#dt-stag">element
type</xtermref>; only elements of the specified type will count as candidates.
For example, the following identifies the 29th paragraph of the fourth sub-division
of the third major division of the location source:<eg>child(3,DIV1).child(4,DIV2).child(29,P)
</eg></p>
<p>The following XPointer selects the last <code>EXAMPLE</code> element in
the document:<eg>descendant(-1,EXAMPLE)</eg></p>
</def></gitem>
<gitem><label><code>#element</code></label>
<def>
<p>Identifies XML elements. If no <nt def="nt-nodetype">NodeType</nt> is specified, <code>
#element</code> is the default. The following example identifies the fifth
child element:<eg>child(5)</eg></p>
</def></gitem>
<gitem><label><code>#pi</code></label>
<def>
<p>Identifies XML processing instructions. This node type cannot satisfy any
attribute constraints. The only location term that can meaningfully be used
with a PI location source is <code>string</code>.</p>
</def></gitem>
<gitem><label><code>#comment</code></label>
<def>
<p>Identifies XML comments. This node type cannot satisfy any attribute constraints.
The only location term that can meaningfully be used with a comment location
source is <code>string</code>.</p>
</def></gitem>
<gitem><label><code>#text</code></label>
<def>
<p>Selects among text regions directly inside elements and CDATA sections.
This node type cannot satisfy any attribute constraints. The only location
term that can meaningfully be used with a text-region location source is <code>
string</code>.</p>
</def></gitem>
<gitem><label><code>#cdata</code></label>
<def>
<p>Selects among text regions found inside CDATA sections. This node type
cannot satisfy any attribute constraints. The only location term that can
meaningfully be used with a CDATA-region location source is <code>string</code>.
</p>
</def></gitem>
<gitem><label><code>#all</code></label>
<def>
<p>Selects among nodes of all the above types.</p>
<p>No node but an element can satisfy any attribute constraints, so if attribute
constraints are provided, <code>#all</code> is effectively equivalent to <code>
#element</code>.</p>
</def></gitem>
</glist> </p>
<p>Among the node types, elements can contain other types, but no other types
can contain anything but strings. Thus, for example, <code>ancestor</code>
location terms locate only element node types, and <code>descendant</code>
location terms navigate downward through elements (not other node types) to
reach the desired element or non-element node type.</p>
<p>Selection by a named element type when possible is strongly recommended;
see <specref ref="persistence"/> for more information.</p>
<p>Consider the following example: <eg>&lt;!DOCTYPE SPEECH [
&lt;!ELEMENT SPEECH (#PCDATA|SPEAKER|DIRECTION)*>
&lt;!ATTLIST SPEECH
        ID      ID      #IMPLIED>
&lt;!ELEMENT SPEAKER (#PCDATA)>
&lt;!ELEMENT DIRECTION (#PCDATA)>
]>
&lt;SPEECH ID="a27">&lt;SPEAKER>Polonius&lt;/SPEAKER>
&lt;DIRECTION>crossing downstage&lt;/DIRECTION>Fare you well,
my lord. &lt;DIRECTION>To Ros.&lt;/DIRECTION>
You go to seek Lord Hamlet? There he is.&lt;/SPEECH></eg></p>
<p>The following XPointers select various sub-resources within this resource:<glist>
<gitem><label><code>id(a27).child(2,DIRECTION)</code></label>
<def>
<p>Selects the second "<code>DIRECTION</code>" element (whose content is "<code>
To Ros.</code>").</p>
</def></gitem>
<gitem><label><code>id(a27).child(2,#element)</code></label>
<def>
<p>Selects the second child element (that is, the first direction, whose content
is "<code>crossing downstage</code>").</p>
</def></gitem>
<gitem><label><code>id(a27).child(2,#text)</code></label>
<def>
<p>Selects the second text region , "<code>Fare you well, my lord.</code>"
(The line break between the <code>SPEAKER</code> and <code>DIRECTION</code>
elements is the first text region.)</p>
</def></gitem>
</glist></p>
</div3>
<div3>
<head>Selection by Attribute</head>
<p>Candidate elements can be selected based on their attribute names and values.
Note that non-element node types have no attributes, and so can never satisfy
selection criteria that include attribute name or value specifications. <scrap
id="attribute" lang="ebnf">
<head>Attribute</head>
<prod id="nt-attr">
<lhs>Attr</lhs><rhs>'*'</rhs><com>any attribute name</com>
<rhs>| <xnt href="WD-xml-lang.html#NT-Name">Name</xnt></rhs>
</prod>
<prod id="nt-val">
<lhs>Val</lhs><rhs>'#IMPLIED'</rhs><com>no value specified, no default</com>
<rhs>| '*'</rhs><com>any value, even defaulted</com>
<rhs>| <xnt href="WD-xml-lang.html#NT-Name">Name</xnt></rhs>
<rhs>| <xnt href="WD-xml-lang.html#NT-SkipLit">SkipLit</xnt></rhs><com>exact
match</com>
</prod>
</scrap></p>
<p>The <nt def="nt-attr">Attr</nt> and <nt def="nt-val">Val</nt> arguments
are used to provide attribute names and values to use in selecting among candidate
elements.</p>
<p>If specified within quotation marks, the attribute-value argument is case-sensitive;
otherwise not.</p>
<p>Attribute names may be specified as "<code>*</code>" in location terms
in the (unlikely) event that an attribute value constitutes a constraint regardless
of what attribute name it is a value for.</p>
<p>For example, the following location term selects the first child of the
location source for which the attribute <code>TARGET</code> has a value:<eg>
child(1,#element,TARGET,*)</eg></p>
<p>The following XPointer chooses an element using the <code>N</code> attribute:<eg>
child(1,#element,N,2).(1,#element,N,1)</eg></p>
<p>Beginning at the location source, the first child (whatever element type
it is) with an <code>N</code> attribute having the value <code>2</code> is
chosen; then that element's first child element having the value  <code>1
</code>  for the same attribute is chosen. Non-element node types cannot be
chosen because they cannot have an <code>N</code> attribute.</p>
<p>The following example selects the first child of the location source that
is an <code>FS</code> element for which the <code>RESP</code> attribute has
been left unspecified:<eg>child(1,FS,RESP,#IMPLIED)</eg></p>
<p>Note that the <code>html</code> keyword is a synonym for a very specific
instance of attribute-based addressing such that the following two XPointers
are equivalent:   
<!--Note here or above, under html section, that
the only difference in this and true HTML functionality
is case sensitivity. -elm-->
<eg>html(Sec3.2)</eg><eg>root().descendant(1,A,NAME,"Sec3.2")</eg></p>
</div3>
<div3 id="descendant-sec">
<head>The descendant Keyword</head>
<p>The <code>descendant</code> keyword selects a node of the specified type
anywhere inside the location source, either directly or indirectly nested.
</p>
<p>The <code>descendant</code> location term looks down through trees of subelements
in order to end at the node type requested, <emph>not</emph> down through
nested levels of intermediate PIs, comments, or text regions. The search for
matching node types occurs in the same order that the start-tags of elements
occur in the XML data stream: The first child of the location source is tested
first, then (if it is an element) that element's first child, and so on. In
formal terms, this is a depth-first traversal.</p>
<p>For example, the following XPointer selects the second <code>TERM</code>
element with a <code>LANG</code> attribute whose value is <code>DE</code>,
occurring within the element with an <code>ID</code> attribute whose value
is <code>A23</code>:<eg>id(a23).descendant(2,TERM,LANG,DE)</eg></p>
<p>If an instance number is positive, the search is depth-first and left-to-right.
If an instance number is negative, the search is depth-first but right-to-left,
in which the right-most, deepest matching element is numbered -1, etc. The
order in which elements are examined corresponds to the ordering of the first
tag encountered. Thus, the following example chooses the last  <code>NOTE
</code> element in the document, that is, the one with the rightmost end-tag:<eg>
root().descendant(-1,NOTE)</eg></p>
<p>If the last <code>NOTE</code> happens to be within another <code>NOTE</code>,
the containing one is chosen, not the subelement, because it extends to a
later point in the document.</p>
</div3>
<div3>
<head>The ancestor Keyword</head>
<p>The <code>ancestor</code> keyword selects an element from among the direct
ancestors of the location source. For positive instance numbers, it counts
upwards from the parent of the location source to the root of the containing
resource. For negative instance numbers, it counts downwards from the root
to the direct parent. Note that <code>ancestor</code> can never select the
location source itself.</p>
<p>For example, the following XPointer first chooses the innermost element
(nearest ancestor) properly containing the location source and having attribute
 <code>N</code> with value <code>1</code>, and then the smallest <code>DIV
</code> element properly containing that ancestor:<eg>ancestor(1,#element,N,1).(1,DIV)
</eg></p>
<p>The node type parameter for <code>ancestor</code>, if supplied, must be
either <code>#element</code> or a particular element type name.  If the current
location source is an attribute, the element on which that attribute occurs
is considered the first ancestor.   
<!--It is debatable whether ANCESTOR should be
usable when the current location source is an a string
(I'm not sure; perhaps it should return the
containing text chunk). -sjd-->
</p>
</div3>
<div3>
<head>The preceding Keyword</head>
<p>The  <code>preceding</code>  keyword selects a node of the specified type
from among those which precede the location source. The set of nodes which
may be selected is the set of all those in the entire document that occur
or begin before the location source. For a positive instance number, it counts
left from the location source; for a negative instance number, it counts right
from the root element of the containing resource. The first delimiter or tag
encountered, starting or ending, counts as an occurrence of that node.</p>
<p>For example, the following XPointer designates the fifth element that occurs
or starts before the element that has an <code>ID</code> of <code>a23</code>:<eg>
id(a23).preceding(5,#element)</eg></p>
<p>Because all ancestors of the location source contain it and potentially
other content, ancestors both "precede" and "follow" their descendants. Therefore,
the following example selects the root element (probably among other nodes):<eg>
id(a23).preceding(all)</eg></p>
</div3>
<div3>
<head>The following Keyword</head>
<p>The  <code>following</code>  keyword selects a node of the specified type
from among those which follow the location source. The set of nodes which
may be selected is the set of all those in the entire document that occur
or end after the location source. For a positive instance number, it counts
right from the location source; for a negative instance number, it counts
left from the end-tag of the root element of the containing resource. The
first delimiter or tag encountered, starting or ending, counts as an occurrence
of that node.</p>
<p>For example, the following XPointer designates the second PI that occurs
after the element that has an <code>ID</code> of <code>a23</code>:<eg>id(a23).following(2,#pi)
</eg></p>
<p>Because all ancestors of the location source contain it and potentially
other content, ancestors both "precede" and "follow" their descendants. Therefore,
the following example selects the root element (probably among other nodes):<eg>
id(a23).following(all)</eg></p>
</div3>
<div3>
<head>The psibling Keyword</head>
<p>The  <code>psibling</code>  keyword selects a node of the specified type
from among those which precede the location source within the same parent
element. The nodes immediately contained by the same <xtermref href="WD-xml-lang.html#dt-parentchild">
parent element</xtermref> are siblings; those siblings which precede the location
source are its elder siblings, and those which follow it are its younger siblings.
</p>
<p>For a positive instance number, <code>psibling</code> counts left from
the most recent elder sibling to the eldest sibling. For a negative instance
number, it counts right from the eldest sibling. The location term fails if
the location source does not have at least as many elder siblings as the absolute
value of the instance number.</p>
<p>For example, this XPointer designates the element immediately preceding
the element with an  <code>ID</code>  of  <code>a23</code>, as long as they
share the same parent:<eg>id(a23).psibling(1,#element)</eg></p>
<p>If the location source has at least one elder sibling, then the following
location term designates the very eldest sibling:<eg>psibling(-1,#element)
</eg></p>
<p>This location term is synonymous with the following XPointer:<eg>ancestor(1,#element).child(1,#element)
</eg></p>
<p>The value  <code>all</code>  may be used to select the entire range of
elder siblings of an element. For example, the following XPointer designates
the set of elements preceding the element that has an  <code>ID</code> of <code>
a23</code> and are contained by the same parent:<eg>id(a23).psibling(all,#element)
</eg></p>
</div3>
<div3>
<head>The fsibling Keyword</head>
<p>The  <code>fsibling</code>  keyword selects a node of the specified type
from among those which follow the location source within the same parent element.
The nodes immediately contained by the same <xtermref href="WD-xml-lang.html#dt-parentchild">
parent element</xtermref> are siblings; those siblings which precede the location
source are its elder siblings, and those which follow it are its younger siblings.
</p>
<p>For a positive instance number, <code>fsibling</code> counts right from
the most recent younger sibling to the youngest sibling. For a negative instance
number, it counts left from the youngest sibling. The location term fails
if the location source does not have at least as many younger siblings as
the absolute value of the instance number.</p>
<p>For example, this XPointer designates the element immediately following
the element with an  <code>ID</code>  of  <code>a23</code>, as long as they
share the same parent:<eg>id(a23).fsibling(1,#element)</eg></p>
<p>If the location source has at least one younger sibling, then the following
location term designates the very youngest sibling:<eg>fsibling(-1,#element)
</eg></p>
<p>This location term is synonymous with the following XPointer:<eg>ancestor(1,#element).child(-1,#element)
</eg></p>
<p>The value  <code>all</code>  may be used to select the entire range of
younger siblings of an element. For example, the following XPointer designates
the set of elements followed the element that has an  <code>ID</code> of <code>
a23</code> and are contained by the same parent:<eg>id(a23).fsibling(all,#element)
</eg></p>
</div3>
</div2>
<div2>
<head><?Pub Dtl?>Spanning Location Term</head>
<p>The <code>span</code> keyword locates a sub-resource starting at the beginning
of the data selected by its first argument and continuing through to the end
of the data selected by its second argument. Both arguments are interpreted
relative to the location source for the spanning location term itself; the
second argument does not use the first argument as its location source.<scrap
id="spanterm" lang="ebnf">
<head>Spanning term</head>
<prod id="nt-spanterm">
<lhs>SpanTerm</lhs><rhs><nt def="nt-keyword">'span('</nt> <nt def="nt-xpointer">
XPointer</nt> ',' <nt def="nt-xpointer">XPointer</nt> ')'</rhs>
</prod>
</scrap></p>
<p>Following is an example of a spanning XPointer that selects the first through
third children of the element with ID <code>a23</code>:<eg>id(a23).span(child(1),child(3))
</eg></p>
<!--Provide an example of an "embedded" span? -elm-->
</div2>
<div2>
<head>Attribute Location Term</head>
<p>The <code>attr</code> keyword takes only an attribute name as a selector
and returns the attribute's value.<scrap id="attrmatch" lang="ebnf">
<head>Attribute-match term</head>
<prod id="nt-attrterm">
<lhs>AttrTerm</lhs><rhs>'attr(' <xnt href="WD-xml-lang.html#NT-Name">Name
</xnt> ')'</rhs>
</prod>
</scrap></p>
<!--Need to say more here, e.g. does it return a null string if the attribute was not specified/defaulted? -elm-->
</div2>
<div2>
<head>String Location Term</head>
<p>The <code>string</code> keyword selects one or more strings or positions
between strings in the location source. <scrap id="stringterm" lang="ebnf">
<head>String-match term</head>
<prod id="nt-stringterm">
<lhs>StringTerm</lhs><rhs>'string(' <nt def="nt-instanceorall">InstanceOrAll
</nt> ',' <xnt href="WD-xml-lang.html#NT-SkipLit">SkipLit</xnt> (',' <nt def="nt-position">
Position</nt> (',' <nt def="nt-length">Length</nt>')?)?)'</rhs>
</prod>
<prod id="nt-position">
<lhs>Position</lhs><rhs>('+' | '-')? [1-9] <xnt href="WD-xml-lang.html#NT-Digit">
Digit</xnt>* | 'end'</rhs>
</prod>
<prod id="nt-length">
<lhs>Length</lhs><rhs>[1-9] <xnt href="WD-xml-lang.html#NT-Digit">Digit</xnt>*
</rhs>
</prod>
</scrap></p>
<glist>
<gitem><label><nt def="nt-instanceorall">InstanceOrAll</nt></label>
<def>
<p>Identifies the <emph>n</emph>th occurrence of the specified string. For
a positive instance number, it counts right from the beginning of the location
source. For a negative instance number, it counts left from the end of the
location source. For the value <code>all</code>, all occurrences of the string
are used as candidates in forming the <xtermref href="http://www.w3.org/TR/WD-xlink#dt-designated">
designated resource</xtermref>.</p>
</def></gitem>
<gitem><label><xnt href="WD-xml-lang.html#NT-SkipLit">SkipLit</xnt></label>
<def>
<p>Identifies the candidate string to be found within the location source.
A null <xnt href="WD-xml-lang.html#NT-SkipLit">SkipLit</xnt> string is considered
to identify the position immediately preceding each character in the location
source. For example, assuming that the element with ID <code>x37</code> contains
the character string "Thomas", the following XPointer identifies the position
before the third character ("o"):<eg>id(x37).string(3,"")</eg></p>
</def></gitem>
<gitem><label><nt def="nt-position">Position</nt></label>
<def>
<p>Identifies a character offset from the start of the candidate string(s)
to the beginning of the desired final string match. The position number may
not be zero; if omitted, it is assumed to be 1.</p>
<p>A positive position number counts right from the beginning of the specified
string. A negative position number counts left from the end of the string;
for example, position -1 is the position immediately preceding the last character
in the match. A position value of <code>end</code> selects the position immediately <emph>
following</emph> the last character of the match.</p>
</def></gitem>
<gitem><label><nt def="nt-length">Length</nt></label>
<def>
<p>Specifies the number of characters to be selected. A length of zero or
an omitted length references a precise point preceding the character indicated
by Position.</p>
</def></gitem>
</glist>
<p>When the location source is a PI or comment, <code>string</code> operates
on the content of that node. However, the content of PIs and comments is not
otherwise considered text content.</p>
<p>For example, the following XPointer selects the position immediately preceding
the letter "<code>P</code>" (8 from the start of the string) in the third
occurrence of the string "<code>Thomas Pynchon</code>":<eg>root().string(3,"Thomas Pynchon",8)
</eg></p>
<p>The following XPointer selects the fifth exclamation mark and the character
immediately following it:<eg>id(a27).string(5,'!',1,1)</eg></p>
<p>For purposes of string matching, the "text of the element" means all the <xtermref
href="WD-xml-lang.html#dt-chardata">character data</xtermref> in the element(s)
in the current location source and descendant elements. Markup characters
are ignored. The pattern matching is exact and character-for-character. No
case, space, or combining-character normalization of any kind is to be performed.
Thus, there would be no match to "Thomas Pynchon" in the following example.
The first seeming match differs in case, and the second by omission of the
word-separating space:<eg>&lt;example>thomas pynchon,
&lt;auth>&lt;first>Thomas&lt;/first>&lt;family>&lt;br/>Pynchon&lt;/family>&lt;/auth>,
Thomas
Pynchon&lt;/example></eg></p>
</div2>
<div2>
<head><?Pub Dtl?>Locations That Are Not Simply Nodes</head>
<p>Most location terms select a single element as their result: for example,
the following XPointer selects one element:<eg>id(foo).child(1,SEC)</eg></p>
<p>Such cases trivially correspond to nodes in element trees, thus admitting
certain implementation simplifications. However, not all locations terms have
this limitation:<olist>
<item><p>The <code>string</code> location term generally returns only part
of a node, but if the matched content had markup within it, the result may
include portions of multiple elements.</p></item>
<item><p>The <code>string</code> location term, when used with the <code>
all</code> instance value, returns a list of typically discontiguous portions
of string data.</p></item>
<item><p>The relative location terms may specify the instance argument as <code>
all</code>, meaning that all candidate nodes are included in the result. The
result is thus a vector of possibly non-adjacent nodes, rather than a subtree.
</p></item>
<item><p>A spanning XPointer may include various elements only partially.
</p></item>
</olist></p>
<p>Each of these cases is described in more detail below.</p>
<div3>
<head>Spanning Strings</head>
<p>A <code>string</code> location term may return parts of several elements.
For example, a <code>string</code> that specified the 12 characters beginning
at the "c" below would return the entire text content of the <code>EMPH</code>
element, plus the text region that follows the <code>EMPH</code> inside the <code>
P</code>:<eg>&lt;P>Hello, &lt;EMPH>cruel&lt;/EMPH> world.&lt;/P></eg></p>
</div3>
<div3>
<head>The all Keyword</head>
<p>The XPointers shown below specify ordered lists of elements. The elements
may or may not be contiguous; in the first case they probably are; in the
second, they probably are not:<eg>id(sec2.1).child(1,list).child(all,list)
</eg><eg>id(div1).descendant(all,h3) </eg></p>
<p>Note that a discontiguous series of elements such as this may be usefully
implemented using the same underlying abstract type that would represent the
results of a query in certain processing scenarios.</p>
</div3>
<div3>
<head>Spanning XPointers</head>
<p>The following spanning XPointer selects everything from the last <code>
P</code> element in one section through the first <code>P</code> in another:
</p>
<eg>span(id(sec2.1).child(-1,P),id(sec2.2).child(1,P))</eg>
<p>Span locations are not subtrees of XML documents, nor are they mere content
data strings. Thus, the result of a spanning selection cannot generally be
expressed as a well-formed XML document, nor as a node or list of nodes from
an element tree. This is because in general, some elements are neither "in"
nor "out of" the span, but in fact are partly in it. For example, the example
above includes the end of the element with id <code>sec2.1</code>, but not
its start. Because of this, implementations that support spans cannot represent
them merely as single nodes or as well-formed XML documents; instead they
must represent them as pairs of locations or by some other means that can
express their greater generality.</p>
<p>Some processing semantics that make sense for nodes or vectors of nodes
may not make sense for spans. A browser could easily highlight just the character
content of a span, but there may be no appropriate semantics to apply in an
outliner or tree-oriented display.</p>
</div3>
</div2>
<div2 id="persistence">
<head><?Pub Dtl?>Link Persistence</head>
<p>It is impossible to guarantee that links to target resources will never
break; the resources could be changed in such a way that even the most robust
link will break. At worst, the author of a target resource could rewrite it
to discuss another subject entirely, making all links irrelevant even if they
refer to resources using IDs. However, under typical conditions, some XPointers
can be reasonably robust.</p>
<p>The most robust locators are usually those which use only an ID, and this
is the preferred locator when available. However, not all elements have IDs,
and link creators often do not have enough control over a target resource
to have an ID added to it. In such cases the preferred locator is one that
points to the nearest containing element that does have an ID, and then walks
down the element tree using the <code>child</code> location term. This form
is relatively robust for two reasons:<ulist>
<item><p>It has a good probability of withstanding editing; for example, no
edit outside the element with the ID can harm the reference.</p></item>
<item><p>It will fail obviously rather than quietly if the link does break.
</p></item>
</ulist></p>
<p>In addition, where relative location terms such as <code>child</code> are
used, selection by named element type (where the second argument in a relative
location term has a <xnt href="WD-xml-lang.html#NT-Name">Name</xnt> in it)
is preferred over selection without specifying a name, for two reasons:<ulist>
<item><p>It is more clear because people typically refer to things by type:
"the second section", "the third paragraph", etc.</p></item>
<item><p>It is more robust because it increases the chance of detecting breakage
if the original target no longer exists.</p></item>
</ulist></p>
</div2>
</div1>
<div1>
<head>Conformance</head>
<p>A string conforms to XPointer if it adheres to the syntactic requirements
imposed by this specification. Note that this does not require that the string,
in association with a URI, actually point to a resource that exists at any
given moment.</p>
<p>Application software conforms to XPointer if it interprets XPointer-conforming
strings according to all required semantics prescribed by this specification
and, for any optional semantics it chooses to support, supports them in the
way prescribed. Application software is free to define its own requirements
on where XPointer strings will be recognized. For example, an XML application
program might choose to recognize XPointers only when they occur in locator
attributes of XLink elements.</p>
</div1>
</body><back>
<div1 id="unfinished">
<head>Unfinished Work</head>
<div2>
<head><?Pub Dtl?>Case Sensitivity in Attribute Values</head>
<p>It is possible to specify a link's resource based on the value of an attribute.
It is is difficult to decide what the correct behavior is as regards case-sensitivity
in matching. Ideally, the declared type of the attribute value should be taken
into account, but that presupposes fetching and reading the document's DTD,
which may not be appropriate in many XML applications. The current system,
while easy to explain, may not prove suitable in the long run.</p>
</div2>
<div2>
<head><?Pub Dtl?>XPointers and Abstract Data Types</head>
<p>Formally, the operations of the XPointer mechanism may may be specified
as operating on abstract data structures, such as defined in DOM and the HyTime
standard (<bibref ref="iso10744"/>). Every node type in such locators has
a corresponding expression in SDQL, and most also have direct equivalents
in the HyTime location module.</p>
</div2>
</div1>
<div1 id="xptr-diffs">
<head>XPointers and TEI Extended Pointers</head>
<p>The XPointer language is based on "extended pointers," a publicly available
technology in use by various SGML-based hypermedia applications, defined in
the Text Encoding Initiative guidelines <bibref ref="tei"/>. This appendix
describes how XPointers differ from extended pointers. The main differences
facilitate the packaging of locators easily within URIs, and omit some more
advanced capabilities:<ulist>
<item><p>Arguments in locator terms must be separated by commas rather than
spaces, to facilitate including XPointers within URIs without escapes, and
location terms are now separated by periods.</p></item>
<item><p>A spanning XPointer may contain two XPointers separated by the string
"<code>,</code>". This combines the capability of the TEI <code>FROM</code>
and <code>TO</code> attributes into a single locator syntax for spans.</p>
</item>
<item><p>The argument-less terms <code>origin</code> and <code>root</code>
take an empty argument list, to distinguish them from possible IDs.</p></item>
<item><p>Regular expression matching for GIs and attributes is not included.
</p></item>
<item><p>The <code>PATTERN</code> term is replaced by a literal <code>string
</code> matching term.</p></item>
<item><p>Options have been added to allow the specification of various non-element
node types, including PIs, comments, and portions of unmarked-up text content
within elements and CDATA sections.</p></item>
<item><p>In addition, a few terms have been renamed for greater clarity.</p>
</item>
<item><p>The <code>SPACE</code>, <code>HyQ</code>, and <code>FOREIGN</code>
keywords have been omitted.</p></item>
</ulist></p>
<p>These changes have been communicated to the TEI, which is considering them
for inclusion in a subsequent revision. </p>
<p>Note that the proposed TEI keyword <code>ATTR</code> has been included
in XPointer.</p>
</div1>
<div1>
<head>References</head>
<blist>
<bibl id="xlink" key="XLINK">Eve Maler and Steve DeRose, editors. <titleref>
XML Linking Language (XLink) V1.0</titleref>. ArborText, Inso, and Brown University.
Burlington, Seekonk, et al.: World Wide Web Consortium, 1998.  (See <loc href="http://www.w3.org/TR/WD-xlink">
http://www.w3.org/TR/WD-xlink</loc>.)</bibl>
<bibl id="iso10744" key="ISO/IEC 10744">ISO (International Organization for
Standardization). <titleref>ISO/IEC 10744-1992 (E).  Information technology &mdash;Hypermedia/Time-based
Structuring Language (HyTime).</titleref> [Geneva]:  International Organization
for Standardization, 1992. <titleref>Extended Facilities Annex.</titleref>
[Geneva]:  International Organization for Standardization, 1996. (See <loc
href="http://www.ornl.gov/sgml/wg8/docs/n1920/html/n1920.html">http://www.ornl.gov/sgml/wg8/docs/n1920/html/n1920.html
</loc>).</bibl>
<bibl id="rfc1738" key="IETF RFC 1738">IETF (Internet Engineering Task Force). <titleref>
RFC 1738:  Uniform Resource Locators</titleref>. 1991. (See <loc href="http://www.w3.org/Addressing/rfc1738.txt">
http://www.w3.org/Addressing/rfc1738.txt</loc>.)</bibl>
<bibl id="rfc1808" key="IETF RFC 1808">IETF (Internet Engineering Task Force). <titleref>
RFC 1808:  Relative Uniform Resource Locators</titleref>. 1995. (See <loc
href="http://www.w3.org/Addressing/rfc1808.txt">http://www.w3.org/Addressing/rfc1808.txt
</loc>).</bibl>
<bibl id="tei" key="TEI">C. M. Sperberg-McQueen and Lou Burnard, editors. <titleref>
Guidelines for Electronic Text Encoding and Interchange</titleref>. Association
for Computers and the Humanities (ACH), Association for Computational Linguistics
(ACL), and Association for Literary and Linguistic Computing (ALLC). Chicago,
Oxford: Text Encoding Initiative, 1994.</bibl>
<bibl id="dom" key="DOM"><titleref>Document Object Model Specification</titleref>.
World Wide Web Consortium, 1997. (See <loc href="http://www.w3.org/TR/WD-DOM">
http://www.w3.org/TR/WD-DOM</loc>.)</bibl>
<bibl id="chum" xml:link="simple" key="CHUM">Steven J. DeRose and David G.
Durand. 1995. "The TEI Hypertext Guidelines." In <titleref>Computing and the
Humanities </titleref>29(3). Reprinted in <titleref>Text Encoding Initiative:
Background and Context</titleref>, ed. Nancy Ide and Jean Véronis, ISBN 0-7923-3704-2.
</bibl>
</blist></div1>
</back></spec>
<?Pub *0000053462?>
