updated definitions and algorithms for vocabulary-specific processing.
authorGregg Kellogg <gregg@kellogg-assoc.com>
Fri, 28 Oct 2011 11:28:49 -0700
changeset 10 74bd1c88b77d
parent 9 b296d3ba308a
child 11 82b6e2e3ebe6
updated definitions and algorithms for vocabulary-specific processing.
microdata-rdf/index.html
--- a/microdata-rdf/index.html	Wed Oct 26 17:01:45 2011 -0700
+++ b/microdata-rdf/index.html	Fri Oct 28 11:28:49 2011 -0700
@@ -271,16 +271,16 @@
     <aref>itemtype</aref> and <aref>itemprop</aref> contexts. This is required, as the Microdata data model
     requires that properties maintain distinct semantic meanings in different contexts. However, this
     form of URI generation is typically different than that used within RDF vocabularies, where
-    properties typically have a common meaning within a given vocabulary.</p>
+    properties typically have a common meaning within a given <tref>vocabulary</tref>.</p>
   <p>Microdata also specifies that items are values are ordered, which is not typically the case for RDF
     vocabularies. In fact, unless a property has an <code>rdfs:range</code> of <code>rdf:List</code>, or is
     unspecified, it may not be appropriate to generate an <tref>RDF Collection</tref>.</p>
-  <p>The Microdata JSON serialization does not retain type or language information that might be derived
-    from the HTML DOM. The RDF Transformation does retain both type and language information when it
+  <p>The Microdata JSON serialization does not retain datatype or language information that might be derived
+    from the HTML DOM. The RDF Transformation does retain both datatype and language information when it
     is available.</p>
   <p>This specification is an update to the original RDF transformation process in addition to
-    vocabulary-specific rules that affect the generation of property URIs and value serializations.
-    This is facilitated by a registry that associates URIs with specific rules based on matching
+    <tref>vocabulary</tref>-specific rules that affect the generation of property URIs and value serializations.
+    This is facilitated by a <tref>registry</tref> that associates URIs with specific rules based on matching
     <aref>itemtype</aref> values against registered URI prefixes do determine a vocabulary and
     vocabulary-specific processing rules.</p>
 </section>
@@ -295,12 +295,12 @@
       and make it available to others to use, as a service. In these cases, the ultimate consumer, who will need to
       understand the vocabularies used within the microdata, is the program or person who pulls out data from Sindice.
       Sindice needs to retain the distinctions in the original Microdata (e.g. ordering of items) and might not have
-      built-in knowledge about the vocabulary of interest to the ultimate consumer. In this case, the ultimate consumer
+      built-in knowledge about the <tref>vocabulary</tref> of interest to the ultimate consumer. In this case, the ultimate consumer
       is likely to have to map/validate/handle errors in the data they get from Sindice.</li>
     <li>A consumer such as <a href="http://openelectiondata.org">openelectiondata.org</a> wants to support
-      Microdata-based markup of their vocabulary as well as RDFa-based markup, both going into an RDF-based data store.
+      Microdata-based markup of their <tref>vocabulary</tref> as well as RDFa-based markup, both going into an RDF-based data store.
       They want to use an off-the-shelf tool to extract the microdata. They want to configure the tool to give them the
-      RDF that is appropriate for their known vocabulary.</li>
+      RDF that is appropriate for their known <tref>vocabulary</tref>.</li>
     <li>A browser plugin that captures data for the user uses an RDF model as its backend store.
       Any time it encounters Microdata on a page, it wants to pull that Microdata into the store on the fly.</li>
     <li><a href="http://purl.org/goodrelations/">GoodRelations</a> require properties to be generated
@@ -316,11 +316,21 @@
       <code>http://schema.org/musicGroupMember</code>, and an author might express more detail through an ad-hoc
       sub-property <em>musicGroupMember/leadVocalist</em>, having the URI
       <code>http://schema.org/musicGroupMember/leadVocalist</code>.</li>
-    <li></li>
   </ul>
 </section>
 
 <section>
+  <h2>Issues</h2>
+  <p>Decisions or open issues in the specification are tracked on the
+    <a href="http://www.w3.org/2011/htmldata/track/issues">Task Force Issue Tracker</a>. These include the
+    following:</p>
+  <dl>
+    <dt><a href="">ISSUE 1</a></dt><dd>Vocabulary specific parsing for Microdata</dd>
+    <dt><a href="">ISSUE 2</a></dt><dd>Should Microdata-RDF generate XMLLiteral values</dd>
+  </dl>
+</section>
+
+<section>
   <h2>Goals</h2>
   <p>The purpose of this specification is to provide input to a future working group that can make decisions
     about the need for a registry and the details of processing. Among the options investigated by
@@ -328,9 +338,10 @@
   <ul>
     <li>Property URI generation using the original Microdata specification with a base URI and fragment
       made up of the in-scope <aref>itemtype</aref> and <aref>itemprop</aref> elements.</li>
-    <li>Vocabulary-based URI generation, where the vocabulary is determined from the in-scope itemtype,
-      either through an algorithmic modification of the type URI or by matching the URI against a registry.
-      The vocabulary URI is then used to generate property URIs in a namespace parallel to the type URI.</li>
+    <li>Vocabulary-based URI generation, where the <tref>vocabulary</tref> is determined from the
+      in-scope <aref>itemtype</aref>, either through an algorithmic modification of the type URI or by matching the
+      URI against a <tref>registry</tref>. The vocabulary URI is then used to generate property URIs in a namespace
+      parallel to the type URI.</li>
     <li>Type-based URI generation, where the URI of the in-scope <aref>itemtype</aref> forms the base of property URI
       by adding the property to the type URI as a fragment.</li>
     <li>When there are multiple top-level items in a document, place items in an RDF Collection.
@@ -350,6 +361,23 @@
     original definition.
   </p>
   <dl>
+    <dt><adef>content</adef></dt><dd>
+      An attribute appropriate for use with the <code>meta</code> element for creating invisible properties.
+    </dd>
+    <dt><adef>data</adef></dt><dd>
+      An attribute appropriate for use with the <code>object</code> element for creating URI<tref>URI
+      reference</tref>s.
+    </dd>
+    <dt><adef>datetime</adef></dt><dd>
+      An attribute appropriate for use with the <code>date</code> element for creating typed literals.
+      <div class="issue">
+        The <code>date</code> element will likely be replaced with something more general purpose.
+      </div>
+    </dd>
+    <dt><adef>href</adef></dt><dd>
+      An attribute appropriate for use with <code>a</code>, <code>area</code> or <code>link</code> elements for
+      creating <tref>URI reference</tref>s.
+    </dd>
     <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
@@ -368,11 +396,6 @@
       (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
@@ -383,6 +406,11 @@
       (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>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>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.
@@ -392,23 +420,6 @@
       (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>content</adef></dt><dd>
-      An attribute appropriate for use with the <code>meta</code> element for creating invisible properties.
-    </dd>
-    <dt><adef>data</adef></dt><dd>
-      An attribute appropriate for use with the <code>object</code> element for creating URI<tref>URI
-      reference</tref>s.
-    </dd>
-    <dt><adef>datetime</adef></dt><dd>
-      An attribute appropriate for use with the <code>date</code> element for creating typed literals.
-      <div class="issue">
-        The <code>date</code> element will likely be replaced with something more general purpose.
-      </div>
-    </dd>
-    <dt><adef>href</adef></dt><dd>
-      An attribute appropriate for use with <code>a</code>, <code>area</code> or <code>link</code> elements for
-      creating <tref>URI reference</tref>s.
-    </dd>
     <dt><adef>src</adef></dt><dd>
       An attribute appropriate for use with <code>audio</code>, <code>embed</code>, <code>iframe</code>,
       <code>img</code>, <code>source</code>, <code>track</code>, or <code>video</code> elements for creating invisible
@@ -420,16 +431,92 @@
 <section>
   <h1>Vocabulary Registry</h1>
   <p>In a perfect world, all processors would be able to generate the same output for a given input
-    without regards to the requirements of a particular vocabulary. However, Microdata doesn't really
-    provide sufficient syntactic help in making these decisions.</p>
-  <section>
-    <h2>Property URI Generation</h2>
-    <p></p>
-  </section>
-  <section>
-    <h2>Item/Value Ordering</h2>
-    <p></p>
-  </section>
+    without regards to the requirements of a particular <tref>vocabulary</tref>. However, Microdata doesn't
+    provide sufficient syntactic help in making these decisions. Different vocabularies have different
+    needs.</p>
+  <p>The <tdef>registry</tdef> associates a <tdef>URI prefix</tdef> with one or more key-value pairs denoting
+  processor behavior. A hypothetical JSON representation of such a registry might be the following:</p>
+<pre class="example" data-transform="updateExample">
+<!--
+{
+  "http://schema.org/": {
+    "propertyURI":    "vocabulary",
+    "multipleValues": "unordered"
+  },
+  "http://microformats.org/profile/hcard": {
+    "propertyURI":    "type",
+    "multipleValues": "list"
+  }
+}
+-->
+</pre>
+  <p>This structure associates mappings for two URIs, <code>http://schema.org/</code> and
+    <code>http://microformats.org/profile/hcard</code>. Items having an <aref>itemtype</aref> with a <tref>URI
+    prefix</tref> from this <tref>registry</tref> use the the rules described for that prefix within the scope of that
+    <aref>itemtype</aref>. This mapping currently defines two rules: <tref><code>propertyURI</code></tref> and
+    <tref><code>multipleValues</code></tref> with values to indicate specific behavior. The interpretation of these
+    rules is defined in the following sections. If an item has no <tref>current type</tref> or the
+    <tref>registry</tref> contains no <tref>URI prefix</tref> matching <tref>current type</tref>, a conforming
+    processor MUST use the default values defined for these rules.</p>
+  <p class="issue">Richard Ciganiak has
+    <cite><a href="http://richard.cyganiak.de/2011/10/microdata.html#whitelists">pointed out</a></cite> that
+    &quot;Registry&quot; may be the wrong term, as the proposed registry doesn't assign identifiers or manage
+    namespace, it simply provides a mapping between URI prefixes and processor behavior and suggests the term
+    &quot;Whitelist&quot;. As more than two values are required, and it describes more than binary behavior, this term
+    isn't appropriate either.</p>
+  <p class="issue">Anytime we discuss maintaining such a database, there are issues surrounding update
+    frequency, URL naming, and how updates are authorized. This remains an open issue. This spec
+    just considers the semantic content of such a list and how it can be used to affect processing without
+    defining its representation or update policies.</p>
+  <p class="issue">The URL of the <tref>registry</tref> must be defined.</p>
+
+<section>
+  <h2>Property URI Generation</h2>
+  <p>For <tref>property names</tref> which are not <tref>absolute URI</tref>s,
+    the <tdef><code>propertyURI</code></tdef> rule defines the algorithm for generating an <tref>absolute URI</tref>
+    given an <tref>evaluation context</tref> including an <tref>current type</tref> and <tref>current
+    property</tref>.</p>
+  <p>The procedure for generating property URIs is defined in
+    <a href="#generate-predicate-URI">Generate Predicate URI</a>.</p>
+  <p>Possible values for <tref><code>propertyURI</code></tref> are the following:</p>
+  <dl>
+    <dt><code>context</code></dt><dd>
+      The <code>context</code> URI generation scheme guarantees that generated property URIs are
+      unique for each <tref>current type</tref> and <tref>current property</tref> combination. This is
+      required as the Microdata model requires that property names are associated with specific
+      items and do not have a global scope.
+    </dd>
+    <dt><code>type</code></dt><dd>
+      The <code>type</code> URI generation scheme appends <tref>property names</tref> that are not
+      <tref>absolute URI</tref>s to <tref>current type</tref> using a "#" separator.
+    </dd>
+    <dt><code>vocabulary</code></dt><dd>
+      The <code>vocabulary</code> URI generation scheme appends <tref>property names</tref> that are not
+      <tref>absolute URI</tref>s to the <tref>URI prefix</tref>.
+    </dd>
+  </dl>
+  <p>The default value of <tref><code>propertyURI</code></tref> is <code>context</code>.</p>
+</section>
+
+<section>
+  <h2>Value Ordering</h2>
+  <p>For items having multiple values for a property,
+    the <tdef><code>multipleValues</code></tdef> rule defines the algorithm for serializing these values.
+    This is required as the Microdata data model requires that values be strictly ordered as defined in
+    <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>. However, many RDF vocabularies expect multiple values to be generated
+    as triples sharing a common subject and predicate.</p>
+    <p>Possible values for <tref><code>multipleValues</code></tref> are the following:</p>
+    <dl>
+      <dt><code>unordered</code></dt><dd>
+        Values are serialized without ordering using a common subject and predicate.
+      </dd>
+      <dt><code>list</code></dt><dd>
+        Multi-valued <aref>itemprop</aref>s are serialized using an <tref>RDF Collection</tref>.
+      </dd>
+    </dl>
+    <p>The default value of <tref><code>multipleValues</code></tref> is <code>list</code>.</p>
+</section>
 </section>
 
 <section>
@@ -441,59 +528,43 @@
   <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>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>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 property</tdef></dt><dd>
+            an <tref>absolute URI</tref> for the <em>current property</em>, used for generating URIs
+            for properties of items without an explicit <aref>itemtype</aref>.
+          </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>
+            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>
+          <dt><tdef>current vocabulary</tdef></dt><dd>
+            an <tref>absolute URI</tref> for the <em>current vocabulary</em>, from the <tref>registry</tref>
           </dd>
         </dl>
       </dd>
+      <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>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
@@ -502,7 +573,17 @@
         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>
+      <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>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>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]]).
@@ -515,10 +596,6 @@
         <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 <aref>itemscope</aref> attribute</dt>
           <dd>
@@ -553,7 +630,9 @@
             <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
-            <div class="issue">The <code>date</code> element will likely be replaced with something more general purpose.</div>
+            <div class="issue">
+              The <code>time</code> element will likely be replaced with something more general purpose.
+            </div>
           </dt>
           <dd>
             <dl>
@@ -602,6 +681,30 @@
           </dd>
         </dl>
       </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>URI reference</tdef></dt><dd>
+        URI references are suitable to be used in <em>subject</em>, <em>predicate</em> or <em>object</em> 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>vocabulary</tdef></dt><dd>
+        A vocabulary is a collection of URIs, suitable for use as an <aref>itemtype</aref> or <aref>itemprop</aref>
+        value, that share a common <tref>URI prefix</tref>. That prefix is the vocabulary URI. A vocabulary URL is not
+        allowed to be a prefix of another vocabulary URI.
+        <div class="note">
+          This definition differs from the language in the HTML spec and is just for the purpose of this
+          document. In HTML, a vocabulary is a specification, and doesn't have a URI. In our view, if one
+          specification defines ten <aref>itemtype</aref>s, then these could be treated as one vocabulary or as ten
+          distinct vocabularies; it is entirely up to the vocabulary creator.
+        </div>
+      </dd>
     </dl>
   </section>
 
@@ -620,20 +723,23 @@
 
     <p>Set <em>item list</em> to an empty list.</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 <em>item</em>, 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>
-        Append <em>result</em> to <em>item list</em>.
+      <li>For each element that is also a <tref>top-level item</tref> run the following algorithm:
+        <ol class="algorithm">
+          <li>
+            <a href="generate-the-triples">Generate the triples</a> for an item <em>item</em>, 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>
+            Append <em>result</em> to <em>item list</em>.
+          </li>
+        </ol>
       </li>
       <li>
         If <em>item 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
+        Set <em>value</em> to the value returned from <a href="#generate-collection">generate an RDF
         Collection</a>.
       </li>
       <li>
@@ -664,14 +770,14 @@
     </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
+        If there is an entry for <em>item</em> in <tref>memory</tref>, then let <em>subject</em> be the subject of
+        that entry. Otherwise, if <em>item</em> 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>Add a mapping from <em>item</em> 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>.
+        If <em>item</em> has an <aref>itemtype</aref> attribute, extract the value as <em>type</em>.
       </li>
       <li>If <em>type</em> is an <tref>absolute URI</tref>, generate the following triple:
         <dl class="triple">
@@ -687,6 +793,8 @@
         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>If the registry contains a <tref>URI prefix</tref> that is a character for character match of <em>type</em>
+        up to the length of the <tref>URI prefix</tref>, set <em>vocab</em> as that <tref>URI prefix</tref>.
       <li>
         Set <em>property list</em> to an empty mapping between properties and one or more ordered
         <em>value</em>s as established below.
@@ -701,28 +809,20 @@
             For each <em>name</em> in the element's <tref>property names</tref>, run the following substeps:
             <ol class="algorithm">
               <li>
-                If <em>name</em> is an <tref>absolute URI</tref>, set <em>predicate</em> to <em>name</em>
-                as a <tref>URI reference</tref>.
-              </li>
+                Let <em>context</em> to a copy of <tref>evaluation context</tref> with <tref>current type</tref> set
+                to <em>type</em> and <tref>current vocabulary</tref> set to <em>vocab</em>.
               <li>
-                Otherwise, if <em>type</em> is not defined, set
-                construct <em>predicate</em> from <tref>document base</tref> by appending a NUMBER SIGN U+0023 ("#")
-                followed by the fragment escaped value of <em>name</em>.
-              </li>
-              <li>
-                Otherwise, construct <em>predicate</em> from <em>type</em> by removing everything
-                following the last SOLIDUS U+002F ("/") or NUMBER SIGN U+0023 ("#") in <em>type</em> and append
-                the fragment escaped value of <em>name</em>. If <em>type</em> contains no
-                SOLIDUS U+002F ("/") or NUMBER SIGN U+0023 ("#") it may not be used for generating a predicate
-                URI; skip this property and any associated <tref>property value</tref>s.
+                Let <em>predicate</em> be the result of <a href="generate-predicate-uri">generate predicate URI</a>
+                using <em>context</em> and <em>name</em>. Update <em>context</em> by setting
+                <tref>current property</tref> to <em>predicate</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.
+                triples</a> for <em>value</em> using <em>context</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>.
@@ -734,15 +834,96 @@
       <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
+          <li><a href="#generate-property-values">Generate property values</a> using a copy of
+            <tref>evaluation context</tref> with <tref>current property</tref> set to <em>predicate</em> and
+            <tref>current vocabulary</tref> set to <em>vocab</em> along with <em>subject</em> and
+            the list of values associated with <em>predicate</em> from <em>property list</em> as <em>values</em>.
+          </li>
+        </ol>
+      </li>
+      <li>Return <em>subject</em></li>
+    </ol>
+  </section>
+  
+  <section>
+    <h3>Generate Predicate URI</h3>
+    <p>Predicate URI generation makes use of <tref>current type</tref>, <tref>current property</tref>
+      and <tref>current vocabulary</tref> from an <tref>evaluation context</tref> <em>context</em>
+      along with <em>name</em>.</p>
+
+    <ol class="algorithm">
+      <li>If <em>name</em> is an <tref>absolute URI</tref>, return <em>name</em>
+        as a <tref>URI reference</tref>.</li>
+      <li>Otherwise, if <tref>current vocabulary</tref> from <em>context</em> is not null
+        and <tref>registry</tref> has an entry for <tref>current vocabulary</tref> having a
+        <tref>propertyURI</tref> entry that is not null, set that as <em>method</em>. Otherwise,
+        set <em>method</em> to <code>contextual</code>.</li>
+      <li>If <em>method</em> is <code>vocabulary</code> return the <tref>URI reference</tref> constructed
+        by appending the fragment escaped value of <em>name</em> to <tref>current vocabulary</tref>.</li>
+      <li>If <em>method</em> is <code>type</code>, return the <tref>URI reference</tref> constructed as follows:
+        <ol class="algorithm">
+          <li>Let <em>s</em> be <tref>current type</tref> from <em>context</em>.</li>
+          <li>If <em>s</em> does not contain a U+0023 NUMBER SIGN character (#),
+            then append a U+0023 NUMBER SIGN character (#) to <em>s</em>.</li>
+          <li>Return the concatenation of <em>s</em>
+            and the fragment-escaped value of <em>name</em> as a <tref>URI reference</tref>.</li>
+        </ol>
+      </li>
+      <li>Otherwise, if <tref>current type</tref> from <em>context</em> return the
+        <tref>URI reference</tref> constructed as follows:
+        <ol class="algorithm">
+          <li>Let <em>s</em> be <tref>document base</tref>.</li>
+          <li>If <em>s</em> does not contain a U+0023 NUMBER SIGN character (#),
+            then append a U+0023 NUMBER SIGN character (#) to <em>s</em>.</li>
+          <li>Return the concatenation of <em>s</em>
+            and the fragment-escaped value of <em>name</em> as a <tref>URI reference</tref>.</li>
+        </ol>
+      <li>Otherwise, return the <tref>URI reference</tref> constructed as follows:
+        <ol class="algorithm">
+          <li>Let <em>s</em> be <tref>current type</tref> from <em>context</em>.</li>
+          <li>If the last character of <em>s</em> is not a U+003A COLON character (:),
+            append a U+0025 PERCENT SIGN character (%), a U+0032 DIGIT TWO character (2), and a U+0030 DIGIT ZERO
+            character (0) to s.</li>
+          <li>Append the fragment-escaped value of <em>name</em> to <em>s</em>.</li>
+          <li>Return the concatenation of <code>http://www.w3.org/1999/xhtml/microdata#</code>
+            and the fragment-escaped value of <em>s</em> as a <tref>URI reference</tref>.</li>
+        </ol>
+      </li>
+    </ol>
+  </section>
+  
+  <section>
+    <h2>Generate Property Values</h2>
+    <p>Property value serialization makes use of <tref>current vocabulary</tref>
+      from an <tref>evaluation context</tref> <em>context</em> along with <em>subject</em>
+      and <em>values</em>.</p>
+
+    <ol class="algorithm">
+      <li>Let <em>predicate</em> be <tref>current property</tref> from <em>context</em>.</li>
+      <li>If <tref>current vocabulary</tref> from <em>context</em> is not null
+        and <tref>registry</tref> has an entry for <tref>current vocabulary</tref> having a
+        <tref><code>multipleValues</code></tref> entry that is not null, set that as <em>method</em>. Otherwise,
+        set <em>method</em> to <code>list</code>.</li>
+      <li>If <em>method</em> is <code>unordered</code>, foreach <em>value</em> in <em>values</em>, 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>
+      <li>Otherwise, if <em>method</em> is <code>list</code>:
+        <ol class="algorithm">
+          <li>If <em>values</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>
-            Otherwise, if <em>predicate</em> in <em>property list</em> contains a single value set
-            <em>value</em> to that value.
+            Otherwise, if <em>values</em> contains a single value set <em>value</em> to that value.
           </li>
           <li>
             Generate the following triple:
@@ -757,12 +938,11 @@
           </li>
         </ol>
       </li>
-      <li>Return <em>subject</em></li>
     </ol>
   </section>
-  
+
   <section id="generate-collection">
-    <h2>Generate an RDF Collection</h2>
+    <h2>Generate 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
@@ -846,7 +1026,9 @@
 -->
 </pre>
 
-<p>This is equivalent to the following Turtle:</p>
+<p>Assuming that <tref>registry</tref> contains a an entry for <code>http://purl.org/vocab/frbr/core#</code>
+  with <tref><code>propertyURI</code></tref> set to <code>vocabulary</code>,
+  this is equivalent to the following Turtle:</p>
 <pre class="example" data-transform="updateExample">
 <!--
 @base <http://books.example.com/> .
@@ -896,7 +1078,9 @@
 -->
 </pre>
 
-<p>It generates these triples expressed in Turtle:</p>
+<p>Assuming that <tref>registry</tref> contains a an entry for <code>http://microformats.org/profile/hcard</code>
+  with <tref><code>propertyURI</code></tref> set to <code>type</code>,
+  it generates these triples expressed in Turtle:</p>
 
 <pre class="example" data-transform="updateExample">
 <!--
@@ -921,8 +1105,10 @@
 
 </section>
 
-<section class="appendix">
+<section class="appendix informative">
   <h1>Acknowledgements</h1>
+  <p>Thanks to Richard Cyganiak for property URI and vocabulary terminology and the general excellent
+    consideration of practical problems in generating RDF from Microdata.</p>
 </section>
 
 </body>