Added Microdata to RDF mapping document.
authorGregg Kellogg <gregg@kellogg-assoc.com>
Tue, 11 Oct 2011 08:36:42 -0700
changeset 0 4347f7d575a1
child 1 53d8a2290460
Added Microdata to RDF mapping document.
microdata-rdf/index.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/microdata-rdf/index.html	Tue Oct 11 08:36:42 2011 -0700
@@ -0,0 +1,772 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Microdata to RDF</title>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<!--
+  === NOTA BENE ===
+  For the three scripts below, if your spec resides on dev.w3 you can check them
+  out in the same tree and use relative links so that they'll work offline,
+  -->
+<script type="text/javascript"
+  src="http://dev.w3.org/2009/dap/ReSpec.js/js/respec.js" class="remove">
+ </script>
+<script type="text/javascript" class="remove">
+
+    var preProc = {
+          apply:  function(c) {
+                    // extend the bibliography entries
+                    berjon.biblio["MICRODATA"] = "<cite><a href=\"http://www.w3.org/TR/2011/WD-microdata-20110525/\">HTML Microdata</a></cite> Ian Hickson Editor. World Wide Web Consortium (work in progress). 25 May 2010. This edition of the HTML Microdata specification is http://www.w3.org/TR/2011/WD-microdata-20110525/. The <a href=\"http://www.w3.org/TR/microdata/\">latest edition of HTML Microdata</a> is available at http://www.w3.org/TR/microdata/";
+
+                    // process the document before anything else is done
+                    var refs = document.querySelectorAll('adef') ;
+                    for (var i = 0; i < refs.length; i++) {
+                        var item = refs[i];
+                        var p = item.parentNode ;
+                        var con = item.innerHTML ;
+                        var sp = document.createElement( 'dfn' ) ;
+                        var tit = item.getAttribute('title') ;
+                        if (!tit) {
+                            tit = con;
+                        }
+                        sp.className = 'adef' ;
+                        sp.title=tit ;
+                        sp.innerHTML = con ;
+                        p.replaceChild(sp, item) ;
+                    }
+                    refs = document.querySelectorAll('aref') ;
+                    for (var i = 0; i < refs.length; i++) {
+                        var item = refs[i];
+                        var p = item.parentNode ;
+                        var con = item.innerHTML ;
+                        var sp = document.createElement( 'a' ) ;
+                        sp.className = 'aref' ;
+                        sp.setAttribute('title', con);
+                        sp.innerHTML = '@'+con ;
+                        p.replaceChild(sp, item) ;
+                    }
+                    // now do terms
+                    refs = document.querySelectorAll('tdef') ;
+                    for (var i = 0; i < refs.length; i++) {
+                        var item = refs[i];
+                        if (!item) continue ;
+                        var p = item.parentNode ;
+                        var con = item.innerHTML ;
+                        var ref = item.getAttribute('title') ;
+                        if (!ref) {
+                            ref = item.textContent ;
+                        }
+                        if (ref) {
+                            ref = ref.replace(/\n/g, '_') ;
+                            ref = ref.replace(/\s+/g, '_') ;
+                        }
+                        var sp = document.createElement( 'dfn' ) ;
+                        sp.title = ref ;
+                        sp.innerHTML = con ;
+                        p.replaceChild(sp, item) ;
+                    }
+                    // now term references
+                    refs = document.querySelectorAll('tref') ;
+                    for (var i = 0; i < refs.length; i++) {
+                        var item = refs[i];
+                        if (!item) continue ;
+                        var p = item.parentNode ;
+                        var con = item.innerHTML ;
+                        var ref = item.getAttribute('title') ;
+                        if (!ref) {
+                            ref = item.textContent ;
+                        }
+                        if (ref) {
+                            ref = ref.replace(/\n/g, '_') ;
+                            ref = ref.replace(/\s+/g, '_') ;
+                        }
+
+                        var sp = document.createElement( 'a' ) ;
+                        var id = item.textContent ;
+                        sp.className = 'tref' ;
+                        sp.title = ref ;
+                        sp.innerHTML = con ;
+                        p.replaceChild(sp, item) ;
+                    }
+                }
+        } ;
+
+
+      var respecConfig = {
+          // specification status (e.g. WD, LCWD, NOTE, etc.). If in doubt use ED.
+          specStatus:           "ED",
+          //publishDate:          "2010-04-29",
+          copyrightStart:       "2011",
+
+          // the specification's short name, as in http://www.w3.org/TR/short-name/
+          shortName:            "microdata-rdf",
+          subtitle:             "Transformation from HTML+Microdata to RDF",
+          // if you wish the publication date to be other than today, set this
+          // publishDate:  "2009-08-06",
+
+          // if there is a previously published draft, uncomment this and set its YYYY-MM-DD date
+          // and its maturity status
+          //previousPublishDate:  "2011-08-17",
+          //previousMaturity:     "ED",
+          //previousDiffURI:      "http://json-ld.org/spec/ED/20110817/index.html",
+          //diffTool:             "http://www.aptest.com/standards/htmldiff/htmldiff.pl",
+
+          // if there a publicly available Editor's Draft, this is the link
+          edDraftURI:           "https://dvcs.w3.org/hg/htmldata/microdata-rdf/",
+
+          // if this is a LCWD, uncomment and set the end of its review period
+          // lcEnd: "2009-08-05",
+
+          // if you want to have extra CSS, append them to this list
+          // it is recommended that the respec.css stylesheet be kept
+          extraCSS:             [
+              "http://dev.w3.org/2009/dap/ReSpec.js/css/respec.css",
+          ],
+
+          // editors, add as many as you like
+          // only "name" is required
+          editors:  [
+              { name: "Gregg Kellogg", url: "http://greggkellogg.net/",
+                company: "Kellogg Associates" },
+          ],
+
+          // authors, add as many as you like.
+          // This is optional, uncomment if you have authors as well as editors.
+          // only "name" is required. Same format as editors.
+
+          authors:  [
+              { name: "Ian Hickson", url: "mailto:ian@hixie.ch",
+                company: "Google, Inc." },
+              { name: "Gregg Kellogg", url: "http://greggkellogg.net/",
+                company: "Kellogg Associates" },
+          ],
+
+          // name of the WG
+          wg:           "HTML Data Task Force",
+
+          // URI of the public WG page
+          wgURI:        "http://www.w3.org/wiki/Html-data-tf",
+
+          // name (with the @w3c.org) of the public mailing to which comments are due
+          wgPublicList: "public-html-data-tf",
+
+          // URI of the patent status for this WG, for Rec-track documents
+          // !!!! IMPORTANT !!!!
+          // This is important for Rec-track documents, do not copy a patent URI from a random
+          // document unless you know what you're doing. If in doubt ask your friendly neighbourhood
+          // Team Contact.
+          wgPatentURI:  "",
+          maxTocLevel: 4,
+          preProcess: [ preProc ],
+          //alternateFormats: [ {uri: "diff-20110817.html", label: "diff to previous version"} ],
+      };
+
+      function updateExample(doc, content) {
+        // perform transformations to make it render and prettier
+        content = content.replace(/<!--/, '');
+        content = content.replace(/-->/, '');
+        content = doc._esc(content);
+        content = content.replace(/\*\*\*\*([^*]*)\*\*\*\*/g, '<span class="diff">$1</span>') ;
+        return content ;
+      }
+
+      function updateDTD(doc, content) {
+        // perform transformations to
+        // make it render and prettier
+        content = '<pre class="dtd">' + doc._esc(content) + '</pre>';
+        content = content.replace(/!ENTITY % ([^ \t\r\n]*)/g, '!ENTITY <span class="entity">% $1</span>');
+        content = content.replace(/!ELEMENT ([^ \t$]*)/mg, '!ELEMENT <span class="element">$1</span>');
+        return content;
+      }
+
+      function updateSchema(doc, content) {
+        // perform transformations to
+        // make it render and prettier
+        content = '<pre class="dtd">' + doc._esc(content) + '</pre>';
+        content = content.replace(/&lt;xs:element\s+name=&quot;([^&]*)&quot;/g, '&lt;xs:element name="<span class="element" id="schema_element_$1">$1</span>"') ;
+        return content;
+      }
+
+      function updateTTL(doc, content) {
+        // perform transformations to
+        // make it render and prettier
+        content = '<pre class="sh_sourceCode">' + doc._esc(content) + '</pre>';
+        content = content.replace(/@prefix/g, '<span class="sh_keyword">@prefix</span>');
+        return content;
+      }
+  </script>
+<style>
+.diff { font-weight:bold; color:#0a3; }
+ol.algorithm { counter-reset:numsection; list-style-type: none; }
+ol.algorithm li { margin: 0.5em 0; }
+ol.algorithm li:before {
+  font-weight: bold;
+  counter-increment: numsection;
+  content: counters(numsection, ".") ") ";
+}
+dl.triple { padding: 0 0 0 1em; }
+dl.triple dt, dl.triple dd { margin: 0; display: inline }
+dl.triple dt:after { content: ':'; }
+dl.triple dd:after { content: '\A'; white-space: pre; }
+</style>
+</head>
+
+<body>
+<section id="abstract">
+</section>
+
+<section id='sotd'>
+<p>This document is an experimental work in progress.</p>
+</section>
+
+<section>
+  <h1>Introduction</h1>
+  <p>
+    This document describes a means of transforming HTML containing Microdata into RDF. HTML Microdata [[!MICRODATA]]
+    is an extension to HTML used to embed machine-readable data to HTML documents. This specification describes
+    transformation directly to RDF [[RDF-CONCEPTS]].
+  </p>
+</section>
+
+<section>
+  <h1>Attributes and Syntax</h1>
+  <p>
+    The Microdata specification [[!MICRODATA]] defines a number of attributes and the way in which those
+    attributes are to be interpreted. This section describes those attributes, with reference to their
+    original definition.
+  </p>
+  <dl>
+    <dt><adef>itemid</adef></dt><dd>
+      An attribute containing a URI used to identify the subject of triples associated with this <tref>item</tref>.
+      Available through the <cite><a
+      href="http://www.w3.org/TR/2011/WD-microdata-20110525/#microdata-dom-api">Microdata DOM API</a></cite> as
+      <code>element.itemId</code>.
+      (See <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#attr-itemscope">Section 3.2 Items</a></cite> in [[!MICRODATA]]).
+    </dd>
+    <dt><adef>itemprop</adef></dt><dd>
+      An attribute used to identify one or more properties to one ore more <tref>item</tref>s. An <aref>itemprop</aref>
+      contains a space separated list of <tdef>name</tdef>s which may either by <tref>absolute URI</tref>s or terms
+      associated with the type of the <tref>item</tref> as defined by the referencing <trdf>item</trdf>'s
+      <aref>itemtype</aref>.
+      Available through the <cite><a
+      href="http://www.w3.org/TR/2011/WD-microdata-20110525/#microdata-dom-api">Microdata DOM API</a></cite> as
+      <code>element.itemProp</code>.
+      (See <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#names:-the-itemprop-attribute">Section 3.3
+      Names: the itemprop attribute</a></cite> of [[!MICRODATA]]).
+    </dd>
+    <dt><adef>itemscope</adef></dt><dd>
+      An boolean attribute identifying an element as an item.
+      (See <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#attr-itemscope">Section 3.2 Items</a></cite>
+      of [[!MICRODATA]]).
+    </dd>
+    <dt><adef>itemref</adef></dt><dd>
+      An additional attribute on an <tref>item</tref> that references additional elements containing property
+      definitions to be applied to the referencing <tref>item</tref>. The attribute value is an unordered
+      list of ID references to elements within the same document.
+      Available through the <cite><a
+      href="http://www.w3.org/TR/2011/WD-microdata-20110525/#microdata-dom-api">Microdata DOM API</a></cite> as
+      <code>element.itemRef</code>.
+      (See <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#attr-itemscope">Section 3.2 Items</a></cite>
+      of [[!MICRODATA]]).
+    </dd>
+    <dt><adef>itemtype</adef></dt><dd>
+      An additional attribute on an <tref>item</tref> used to specify the type of an <tref>item</tref>.
+      The specified type is also used to resolve non-URI <tref>name</tref>s to <tref>absolute URI</tref>s.
+      Available through the <cite><a
+      href="http://www.w3.org/TR/2011/WD-microdata-20110525/#microdata-dom-api">Microdata DOM API</a></cite> as
+      <code>element.itemType</code>.
+      (See <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#attr-itemscope">Section 3.2 Items</a></cite>
+      of [[!MICRODATA]]).
+    </dd>
+  </dl>
+</section>
+
+<section>
+  <h1>Algorithm</h1>
+  <p>
+    Transformation of Microdata to RDF makes use of general processing rules described in [[!MICRODATA]]
+    for the treatment of <tref>item</tref>s.
+  </p>
+  <section>
+    <h2>Algorithm Terms</h2>
+    <dl>
+      <dt><tdef>item</tdef></dt><dd>
+         An <tref>item</tref> is defined as an element containing an <aref>itemscope</aref> attribute. (See <cite><a
+         href="http://www.w3.org/TR/2011/WD-microdata-20110525/#attr-itemscope">Section 3.2 Items</a></cite> of
+         [[!MICRODATA]]).
+      </dd>
+      <dt><tdef>top-level item</tdef></dt><dd>
+        An <tref>item</tref> which does not contain an <aref>itemprop</aref> attribute.
+        Available through the <cite><a
+        href="http://www.w3.org/TR/2011/WD-microdata-20110525/#microdata-dom-api">Microdata DOM API</a></cite> as
+        <code>document.getItems</code>.
+        (See <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#top-level-microdata-items">Section 3.5
+        Associating names with items</a></cite> of [[!MICRODATA]]).
+      </dd>
+      <dt><tdef>absolute URI</tdef></dt><dd>
+        As defined in [[!RFC3986]], an absolute URI contains both <em>scheme</em> and <em>scheme-specific-part</em>s.
+      </dd>
+      <dt><tdef>document base</tdef></dt><dd>
+        The base address of the document being processed, as defined in <cite><a
+        href="http://dev.w3.org/html5/spec/Overview.html#resolving-urls">Section 2.6.3 Resolving URLs</a> of
+        [[!HTML5]]</cite>.
+      </dd>
+      <dt><tdef>global identifier</tdef></dt><dd>
+        The value of an <tref>item</tref>'s <aref>itemid</aref> attribute, if it has one. (See <cite><a
+        href="http://www.w3.org/TR/2011/WD-microdata-20110525/#attr-itemscope">Section 3.2 Items</a></cite> of
+        [[!MICRODATA]]).
+      </dd>
+      <dt><tdef>URI reference</tdef></dt><dd>
+        URI references are suitable to be used as subject predicate or object positions within an RDF triple,
+        as opposed to a <tref>Literal</tref> value that may contain a string representation of a URI. (See
+        [[RDF-CONCEPTS]]).
+      </dd>
+      <dt><tdef>Blank Node</tdef></dt><dd>
+        A blank node is a node in a graph that is neither a <tref>URI reference</tref> nor a <tref>Literal</tref>.
+        <tref>Item</tref>s without a <tref>global identifier</tref> have a blank node allocated to them.
+        (See [[RDF-CONCEPTS]]).
+      </dd>
+      <dt><tdef>Literal</tdef></dt><dd>
+        Literals a values such as strings and dates, including <tdef>typed literal</tdef>s and
+        <tdef>plain literal</tdef>s.
+        (See [[RDF-CONCEPTS]]).
+      </dd>
+      <dt><tdef>evaluation context</tdef></dt><dd>
+        A data structure including the following elements:
+        <dl>
+          <dt><tdef>memory</tdef></dt><dd>
+            a mapping of items to subjects, initially empty
+          </dd>
+          <dt><tdef>current type</tdef></dt><dd>
+            an <tref>absolute URI</tref> for the <em>current type</em>, used when an <tref>item</tref> does not contain
+            an explicit <aref>itemtype</aref>
+          </dd>
+        </dl>
+      </dd>
+      <dt><tdef>item properties</tdef></dt><dd>
+        The mechanism for finding the <tref title="item properties">properties of an item</tref> are described in
+        <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#the-properties-of-an-item">Section 3.5
+        Associating names with items</a></cite> of [[!MICRODATA]].
+        Available through the <cite><a
+        href="http://www.w3.org/TR/2011/WD-microdata-20110525/#microdata-dom-api">Microdata DOM API</a></cite> as
+        <code>element.properties</code>.
+      </dd>
+      <dt><tdef>property names</tdef></dt><dd>
+        The tokens of an element's <aref>itemprop</aref> attribute.
+        (See <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#property-names">Section 3.3 Names: the
+        itemprop attribute</a></cite> of [[!MICRODATA]]).
+      </dd>
+      <dt><tdef>property value</tdef></dt><dd>
+        The <tref>property value</tref> of a name-value pair added by an element with an <aref>itemprop</aref>
+        attribute depends on the element.
+        Available through the <cite><a
+        href="http://www.w3.org/TR/2011/WD-microdata-20110525/#microdata-dom-api">Microdata DOM API</a></cite> as
+        <code>element.itemValue</code>.
+        (Updated from <cite><a href="http://www.w3.org/TR/2011/WD-microdata-20110525/#url-property-elements">Section
+        3.4 Values</a></cite> of [[!MICRODATA]]).
+        <div class="issue">
+          If we reference <code>element.itemValue</code> we should file issues against the Microdata spec
+          to ensure that values returned are consisted with this spec.
+        </div>
+        <dl>
+          <dt>If the element also has an <tref>itemscope</tref> attribute</dt>
+          <dd>
+            The value is the <tref>item</tref> created by the element as a <tref>URI reference</tref> or
+            <tref>blank node</tref>
+          </dd>
+          <dt>If the element is a <code>meta</code> element</dt>
+          <dd>
+            The value is the <tref>plain literal</tref> created from the value of the element's <aref>content</aref>
+            attribute, if any, or the empty string if there is no such attribute.
+          </dd>
+          <dt>
+            If the element is an <code>audio</code>, <code>embed</code>, <code>iframe</code>, <code>img</code>,
+            <code>source</code>, <code>track</code>, or <code>video</code> element with a <aref>src</aref> attribute
+          </dt>
+          <dd>
+            The value is a <tref>URI reference</tref> that results from resolving the value of the element's
+            <aref>src</aref> attribute relative to the element at the time the attribute is set.
+          </dd>
+          <dt>
+            If the element is an <code>a</code>, <code>area</code>, or <code>link</code> element with an
+            <aref>href</aref> attribute
+          </dt>
+          <dd>
+            The value is a <tref>URI reference</tref> that results from resolving the value of the element's
+            <aref>href</aref> attribute relative to the element at the time the attribute is set.
+          </dd>
+          <dt>If the element is an <code>object</code> element with a <aref>data</aref> attribute</dt>
+          <dd>
+            The value is <tref>URI reference</tref> that results from resolving the value of the element's
+            <aref>data</aref> attribute relative to the element at the time the attribute is set.
+          </dd>
+          <dt>If the element is a <code>time</code> element with a <aref>datetime</aref> attribute</dt>
+          <dd>
+            <dl>
+              <dt>
+                If the value has the lexical form of <cite><a
+                href="http://www.w3.org/TR/xmlschema-2/#date">xsd:date</a></cite> [[!RDF-SCHEMA]]
+              </dt>
+              <dd>
+                The value is a <tref>typed literal</tref> composed of the value and
+                <code>http://www.w3.org/2001/XMLSchema#date</code>
+              </dd>
+              <dt>
+                If the value has the lexical form of <cite><a
+                href="http://www.w3.org/TR/xmlschema-2/#time">xsd:time</a></cite> [[!RDF-SCHEMA]]
+              </dt>
+              <dd>
+                The value is a <tref>typed literal</tref> composed of the value and
+                <code>http://www.w3.org/2001/XMLSchema#time</code>
+              </dd>
+              <dt>
+                If the value has the lexical form of <cite><a
+                href="http://www.w3.org/TR/xmlschema-2/#dateTime">xsd:dateTime</a></cite> [[!RDF-SCHEMA]]
+              </dt>
+              <dd>
+                The value is a <tref>typed literal</tref> composed of the value and
+               <code>http://www.w3.org/2001/XMLSchema#dateTime</code>
+              </dd>
+              <!-- revisit when/if content model for @datetime is updated to allow for xsd:duration
+              <dt>
+                If the value has the lexical form of <cite><a
+                href="http://www.w3.org/TR/xmlschema-2/#duration">xsd:duration</a></cite> [[!RDF-SCHEMA]]
+              </dt>
+              <dd>
+                The value is a <tref>typed literal</tref> composed of the value and
+                <code>http://www.w3.org/2001/XMLSchema#duration</code>
+              </dd>
+              -->
+              <dt>Otherwise</dt>
+              <dd>The value is a <tref>plain literal</tref> created from the value.</dd>
+            </dl>
+          </dd>
+          <dt>
+            If the element is an <code>blockquote</code> or <code>q</code> element with n
+            <aref>cite</aref> attribute
+          </dt>
+          <dd>
+            The value is <tref>URI reference</tref> that results from resolving the value of the element's
+            <aref>cite</aref> attribute relative to the element at the time the attribute is set
+            <div class="note">
+              Was formerly document-level, now part of item value processing.
+            </div>
+          </dd>
+          <dt>Otherwise</dt>
+          <dd>
+            The value is a <tref>plain literal</tref>, with the language information set from the language of the
+            element, if it is not unknown.
+          </dd>
+        </dl>
+      </dd>
+    </dl>
+  </section>
+
+  <section>
+    <h3>RDF Conversion Algorithm</h3>
+    <p>A HTML document containing Microdata MAY be converted to any other RDF-compatible document
+    format using the algorithm specified in this section.</p>
+    <p>
+      The algorithm below is designed for DOM-based implementations with CSS selector access to elements.
+    </p>
+    <p>
+      A conforming Microdata processor implementing RDF conversion MUST implement a
+      processing algorithm that results in the equivalent triples that the following
+      algorithm generates:
+    </p>
+
+    <p>For each element that is also a <tref>top-level item</tref> run the following algorithm:</p>
+    <ol class="algorithm">
+      <li>
+        <a href="generate-the-triples">Generate the triples</a> for an item item, using the
+        <tref>evaluation context</tref>.
+        Let <em>result</em> be the (<tref>URI reference</tref> or <tref>blank node</tref>) subject returned.
+      </li>
+      <li>
+        Generate the following triple:
+        <dl class="triple">
+          <dt>subject</dt>
+          <dd><tref>Document base</tref></dd>
+          <dt>predicate</dt>
+          <dd><code>http://www.w3.org/1999/xhtml/microdata#item</code></dd>
+          <dt>object</dt>
+          <dd><em>result</em></dd>
+        </dl>
+        <div class="issue">
+          Editor's suggestion, remove this generation of the <tref>item</tref> triple, which only serves to
+          associate all top-level items to the document, something that is already done by virtue of being in
+          the same document.
+        </div>
+        <div class="issue">
+          If we keep md:item, the values should probably be in an rdf:List like other multi-value items.
+        </div>
+      </li>
+    </ol>
+  </section>
+
+  <section>
+    <h2>Generate the triples</h2>
+    <p>
+      When the user agent is to Generate triples for an <tref>item</tref> <em>item</em>, given an
+      <tref>Evaluation Context</tref>, it must run the following steps:
+    </p>
+    <p class="note">
+      This algorithm has undergone substantial change from the original Microdata specification [[!MICRODATA]].
+    </p>
+    <ol class="algorithm">
+      <li>
+        If there is an entry for <tref>item</tref> in <tref>memory</tref>, then let <em>subject</em> be the subject of
+        that entry. Otherwise, if <tref>item</tref> has a <tref>global identifier</tref> and that
+        <tref>global identifier</tref> is an <tref>absolute URI</tref>, let <em>subject</em> be that
+        <tref>global identifier</tref>. Otherwise, let <em>subject</em> be a new <tref>blank node</tref>.
+      </li>
+      <li>Add a mapping from <tref>item</tref> to <em>subject</em> in <tref>memory</tref></li>
+      <li>
+        If the <tref>item</tref> has an <aref>itemtype</aref> attribute, extract the value as <em>type</em>.
+        but with duplicates removed (leaving only the first occurrence of each type)
+      </li>
+      <li>If <em>type</em> is an <tref>absolute URI</tref>, generate the following triple:
+        <dl class="triple">
+          <dt>subject</dt>
+          <dd><em>subject</em></dd>
+          <dt>predicate</dt>
+          <dd><code>http://www.w3.org/1999/02/22-rdf-syntax-ns#type</code></dd>
+          <dt>object</dt>
+          <dd><em>type</em> (as a <tref>URI reference</tref>)</dd>
+        </dl>
+      </li>
+      <li>
+        If <em>type</em> is not an <tref>absolute URI</tref>, set it to <tref>current type</tref> from the
+        <tref>Evaluation Context</tref> if not empty.
+      </li>
+      <li>
+        For each element <em>element</em> that has one or more <tref>property names</tref> and is one of the
+        <tref title="item properties">properties of the item</tref> <em>item</em>, in the order those elements
+        are given by the algorithm that returns the <tref title="item properties">properties of the item</tref>,
+        run the following substep:
+        <ol class="algorithm">
+          <li>
+            Set <em>property list</em> to an empty mapping between properties and one or more ordered
+            <em>value</em>s as established below.
+          </li>
+          <li>
+            For each <em>name</em> in the element's <tref>property names</tref>, run the following substeps:
+            <ol class="algorithm">
+              <li>
+                If <em>type</em> is not defined and <em>name</em> is not an <tref>absolute URI</tref>
+                <em>predicate</em> is a <tref>URI reference</tref> that results from resolving <em>type</em> relative
+                to the element at the time the attribute is set.
+              </li>
+              <li>
+                Otherwise, if <em>name</em> is not an <tref>absolute URI</tref>, set <em>predicate</em> to
+                <em>name</em>, otherwise construct <em>predicate</em> from <em>type</em> by removing everything
+                following the last SOLIDUS U+002F ("/") or NUMBER SIGN U+0023 ("#") in type and appending
+                <em>name</em>.
+              </li>
+              <li>
+                Let <em>value</em> be the <tref>property value</tref> of <em>element</em>.
+              </li>
+              <li>
+                If <em>value</em> is an <tref>item</tref>, then <a href="generate-the-triples">generate the
+                triples</a> for <em>value</em> using a copy of <tref>evaluation context</tref> with
+                <tref>current type</tref> set to <em>type</em>. Replace <em>value</em> by the subject returned from those steps.
+              </li>
+              <li>
+                Add <em>value</em> to <em>property list</em> for <em>predicate</em>.
+              </li>
+            </ol>
+          </li>
+        </ol>
+      </li>
+      <li>
+        For each <em>predicate</em> in <em>property list</em>:
+        <ol class="algorithm">
+          <li>
+            If entry for <em>predicate</em> in <em>property list</em> contains multiple values, <a
+            href="generate-collection">generate an RDF Collection</a> <em>list</em> from the ordered list of values.
+            Set <em>value</em> to the value returned from <a href="generate-collection">generate an RDF
+            Collection</a>.
+          </li>
+          <li>
+            Generate the following triple:
+            <dl class="triple">
+              <dt>subject</dt>
+              <dd><em>subject</em></dd>
+              <dt>predicate</dt>
+              <dd><em>predicate</em></dd>
+              <dt>object</dt>
+              <dd><em>value</em></dd>
+            </dl>
+          </li>
+        </ol>
+      </li>
+      <li>Return <em>subject</em></li>
+    </ol>
+  </section>
+  
+  <section id="generate-collection">
+    <h2>Generate an RDF Collection</h2>
+    <p>
+      An <tdef>RDF Collection</tdef> is a mechanism for defining ordered sequences of objects in RDF (See <cite><a
+      href="http://www.w3.org/TR/rdf-syntax/#collections">Section 5.2 RDF Collections</a></cite> in
+      [[!RDF-SCHEMA]]). As the RDF data-model is that of an unordered graph, a linking method using properties
+      <code>rdf:first</code> and <code>rdf:next </code>is required to be able to specify a particular order.
+    </p>
+    <p>
+      In the Microdata to RDF mapping, <tref>RDF Collection</tref>s are used when an item has more than one value
+      associated with a given property to ensure that the original document order is maintained. The following
+      procedure should be used to generate triples when an <tref>item</tref> property has more than one value
+      (contained in <em>list</em>):
+    </p>
+    <ol class="algorithm">
+      <li>
+        Create a new array <em>array</em> containing a <tref>blank node</tref> for every value in <em>list</em>.
+      </li>
+      <li>
+        For each pair of <em>bnode</em> and <em>value</em> from <em>array</em> and <em>list</em> the following
+        triple is generated:
+        <dl class="triple">
+          <dt>subject</dt>
+          <dd><em>bnode</em></dd>
+          <dt>predicate</dt>
+          <dd><code>http://www.w3.org/1999/02/22-rdf-syntax-ns#first</code></dd>
+          <dt>object</dt>
+          <dd><em>value</em></dd>
+        </dl>
+      </li>
+      <li>
+        For each <em>bnode</em> in <em>array</em> the following triple is generated:
+        <dl class="triple">
+          <dt>subject</dt>
+          <dd><em>bnode</em></dd>
+          <dt>predicate</dt>
+          <dd><code>http://www.w3.org/1999/02/22-rdf-syntax-ns#rest</code></dd>
+          <dt>object</dt>
+          <dd>
+            next element in <em>array</em> or, if that does not exist,
+            <code>http://www.w3.org/1999/02/22-rdf-syntax-ns#nil</code>
+          </dd>
+        </dl>
+      </li>
+      <li>
+        Return the first <tref>blank node</tref> from <em>array</em>.
+      </li>
+    </ol>
+  </section>
+</section>
+
+<section class="appendix">
+<h2>Markup Examples</h2>
+
+<p>The Microdata example below expresses book information as an FRBR Work item.</p>
+
+<pre class="example" data-transform="updateExample">
+<!--
+<dl itemscope
+    itemtype="http://purl.org/vocab/frbr/core#Work"
+    itemid="http://purl.oreilly.com/works/45U8QJGZSQKDH8N"
+    lang="en">
+ <dt>Title</dt>
+ <dd><cite itemprop="http://purl.org/dc/terms/title">Just a Geek</cite></dd>
+ <dt>By</dt>
+ <dd><span itemprop="http://purl.org/dc/terms/creator">Wil Wheaton</span></dd>
+ <dt>Format</dt>
+ <dd itemprop="realization"
+     itemscope
+     itemtype="http://purl.org/vocab/frbr/core#Expression"
+     itemid="http://purl.oreilly.com/products/9780596007683.BOOK">
+  <link itemprop="http://purl.org/dc/terms/type" href="http://purl.oreilly.com/product-types/BOOK">
+  Print
+ </dd>
+ <dd itemprop="realization"
+     itemscope
+     itemtype="http://purl.org/vocab/frbr/core#Expression"
+     itemid="http://purl.oreilly.com/products/9780596802189.EBOOK">
+  <link itemprop="http://purl.org/dc/terms/type" href="http://purl.oreilly.com/product-types/EBOOK">
+  Ebook
+ </dd>
+</dl>
+-->
+</pre>
+
+<p>This is equivalent to the following Turtle:</p>
+<pre class="example" data-transform="updateExample">
+<!--
+@base <http://books.example.com/> .
+@prefix dc: <http://purl.org/dc/terms/> .
+@prefix md: <http://www.w3.org/1999/xhtml/microdata#> .
+@prefix frbr: <http://purl.org/vocab/frbr/core#> .
+
+<> md:item <works/45U8QJGZSQKDH8N> .
+
+<works/45U8QJGZSQKDH8N> a frbr:Work ;
+  dc:creator "Wil Wheaton"@en ;
+  dc:title "Just a Geek"@en ;
+  frbr:realization (
+    <products/9780596007683.BOOK>
+    <products/9780596802189.EBOOK>
+  ) .
+
+<products/9780596007683.BOOK> a frbr:Expression ;
+  dc:type <product-types/BOOK> .
+
+<products/9780596802189.EBOOK> a frbr:Expression ;
+  dc:type <product-types/EBOOK> .
+-->
+</pre>
+
+<p>The following snippet of HTML has microdata for two people with the same address:</p>
+<pre class="example" data-transform="updateExample">
+<!--
+<p>
+ Both
+ <span itemscope itemtype="http://microformats.org/profile/hcard#" itemref="home">
+   <span itemprop="fn"
+       ><span itemprop="n" itemscope
+       ><span itemprop="given-name">Princeton</span></span></span>
+  </span>
+ and
+ <span itemscope itemtype="http://microformats.org/profile/hcard#" itemref="home">
+   <span itemprop="fn"
+     ><span itemprop="n" itemscope
+       ><span itemprop="given-name">Trekkie</span></span></span>
+  </span>
+ live at
+ <span id="home" itemprop="adr" itemscope>
+   <span itemprop="street-address">Avenue Q</span>.
+ </span>
+</p>
+-->
+</pre>
+
+<p>It generates these triples expressed in Turtle:</p>
+
+<pre class="example" data-transform="updateExample">
+<!--
+@prefix md: <http://www.w3.org/1999/xhtml/microdata#> .
+@prefix hcard: <http://microformats.org/profile/hcard#> .
+
+<> md:item
+  [ a hcard:;
+    hcard:fn "Princeton";
+    hcard:n [ hcard:given-name "Princeton" ];
+    hcard:adr _:a
+  ],
+  [ a hcard:;
+    hcard:fn "Trekkie";
+    hcard:n [ hcard:given-name "Trekkie" ];
+    hcard:adr _:a
+  ] .
+
+_:a hcard:street-address "Avenue Q" .
+-->
+</pre>
+
+</section>
+
+<section class="appendix">
+  <h1>Acknowledgements</h1>
+</section>
+
+</body>
+</html>