<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt'?>
<!-- external references as entities -->
<!DOCTYPE rfc SYSTEM "http://xml.resource.org/authoring/rfc2629.dtd" [
        <!ENTITY rfc1738 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.1738.xml">
        <!ENTITY rfc2119 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
        <!ENTITY rfc3023 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3023.xml">
        <!ENTITY rfc3987 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3987.xml">
        <!ENTITY rfc4627 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4627.xml">
        <!ENTITY rfc5988 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5988.xml">
        <!ENTITY rfc6906 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6906.xml">
        <!ENTITY rfc7320 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7320.xml">
        ]>
<!-- ref commands -->
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc rfcedstyle="yes"?>
<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>

<!-- the actual document! -->
<rfc 
  docName="draft-amundsen-richardson-foster-alps-05" 
  ipr="trust200902" 
  category="info"
  submissionType="IETF">
  <!-- front matter -->
  <front>
    <title abbrev="Application-Level Profile Semantics">
      Application-Level Profile Semantics (ALPS)
    </title>
    <author fullname="Mike Amundsen" surname="Amundsen" initials="M.">
      <address>
        <email>mamund@yahoo.com</email>
        <uri>http://amundsen.com</uri>
      </address>
    </author>
    <author fullname="Leonard Richardson" surname="Richardson" initials="L.">
      <address>
        <email>leonardr@segfault.org</email>
        <uri>http://crummy.com</uri>
      </address>
    </author>
    <author fullname="Mark W. Foster" surname="Foster" initials="M.">
      <address>
        <email>mwf@fosrias.com</email>
      </address>
    </author>
    <date/>
    <abstract>
      <t>
        This document describes ALPS, a data format for
        defining simple descriptions of application-level
        semantics, similar in complexity to HTML
        microformats. An ALPS document can be used as a
        profile to explain the application semantics of a
        document with an application-agnostic media type (such
        as HTML, HAL, Collection+JSON, Siren, etc.). This
        increases the reusability of profile documents across
        media types.
      </t>
    </abstract>
    <note title="Editorial Note (To be removed by RFC Editor)">
      <t>
        Distribution of this document is unlimited. Comments should be sent to the
        IETF Media-Types mailing list (see
        <eref target="https://www.ietf.org/mailman/listinfo/media-types"/>).
      </t>
    </note>
  </front>
  <!-- main body -->
  <middle>
    <section title="Introduction">
      <t>
        This document describes ALPS, a media type for defining
        simple descriptions of application-level semantics,
        similar in complexity to HTML microformats. These
        descriptions contain both human-readable and
        machine-readable explanations of the semantics.
        An ALPS document can be used as a profile to explain the
        application semantics of a document with an
        application-agnostic media type (such as HTML, HAL,
        Collection+JSON, Siren. etc.).
      </t>
      <t>
        This document identifies a registry for ALPS documents,
        (The ALPS Profile Registry or APR). The details of
        this registry, its goals, and operations are covered
        in a separate document (TBD).
      </t>
      <t>
        This document also identifies a process for authoring,
        publishing, and sharing normative
        human-readable instructions on applying an ALPS document
        as a profile to responses of a given media type. For
        example, a document that describes how to apply the
        semantics of an ALPS profile to an HTML document.
      </t>
      <t>
        This document registers two media-type identifiers with
        the IANA: 'application/alps+xml' ('ALPS+XML') and
        'application/alps+json' ('ALPS+JSON').
      </t>
      <section title="Notational Conventions">
        <t>
          The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
          "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",
          "MAY", and "OPTIONAL" in this document are to be
          interpreted as described in <xref target="RFC2119"/>.
        </t>
      </section>
      <section title="Motivation">
        <t>
          When implementing a hypermedia client/server
          application using a general media type (HTML,
          Atom, Collection+JSON, etc.), client and server
          instances need to share an understanding of
          domain-specific information such as data element
          names, link relation values, and state transfer
          parameters. This information is directly related
          to the application being implemented
          (e.g. accounting, contact management, etc.) rather
          than the media type used in the representations.
        </t>
        <section title="Describing Domain-Specific Semantics">
          <t>
            Instead of creating and registering an
            entirely new media type
            (i.e. 'application/accounting'),
            representation authors can create an ALPS
            document that describes a 'profile' of the
            target domain; one that explains the vital
            domain-specific semantic descriptors and state
            transitions. This profile can then be
            consistently applied to a wide range of media
            types by server implementors and successfully
            consumed by client applications. The focus on
            defining application-level semantics,
            independent of transfer protocol or media type,
            makes it possible to serve
            application-specific representations using an
            application-agnostic media type.
          </t>
        </section>
        <section title="ALPS-based Server Implementations">
          <t>
            Server implementors can use ALPS documents as
            a basis for building domain-specific solutions
            without having to create their own custom
            media type or re-invent the vocabulary and
            transition set for a common domain (e.g.
            accounting, microblogging, etc.). Using a
            preexisting ALPS profile as a guide, servers
            can map internal data to commonly-understood
            semantic descriptors and state transitions,
            increasing the likelihood that existing client
            applications (those who share the same
            understanding of the ALPS document) will be
            able to successfully interact with that
            server.
          </t>
        </section>
        <section title="ALPS-based Client Implementations">
          <t>
            Armed with a document's ALPS profile, client
            applications can associate the ALPS descriptor 'id' and/or
            'name' attribute values with the appropriate
            elements within the document.
            Client applications can 'code for the profile'
            and better adjust to detailed changes to the
            response layout, or even the wholesale
            replacement of one media type with another.
          </t>
        </section>
      </section>
      <section title="A Simple ALPS Example" anchor="example">
        <t>
          Below is an ALPS document that describes elements
          of a simple request/response interaction in a
          contact management application. The profile
          defines a semantic descriptor called 'contact',
          and three subordinate descriptors ('fullName',
          'email', and 'phone').
        </t>
        <t>
          The ALPS document also defines a single, safe
          state transition, to be represented by a
          hypermedia control (e.g. HTML.GET form) with the
          'id' value of 'collection.' This hypermedia
          control has one input value ('nameSearch'). When
          executed, the response will contain one or more
          'contact' type items.
        </t>
        <figure title="ALPS Contact Profile document">
          <artwork><![CDATA[
 <alps version="1.0">
  <doc format="text">A contact list.</doc>
  <link rel="help" href="http://example.org/help/contacts.html" />

  <!-- a hypermedia control for returning contacts -->
  <descriptor id="collection" type="safe" rt="contact">
    <doc>
      A simple link/form for getting a list of contacts.
    </doc>
    <descriptor id="nameSearch" type="semantic">
      <doc>Input for a search form.</doc>
    </descriptor>
  </descriptor>

  <!--  a contact: one or more of these may be returned -->
  <descriptor id="contact" type="semantic">
    <descriptor id="item" type="safe">
      <doc>A link to an individual contact.</doc>
    </descriptor>
    <descriptor id="fullName" type="semantic" />
    <descriptor id="email"    type="semantic" />
    <descriptor id="phone"    type="semantic" />
  </descriptor>
</alps>
               ]]></artwork>
        </figure>
        <t>
          Implementing the ALPS profile above requires implementing
          the descriptors defined by the ALPS document. In this case,
          there are two 'top level' descriptors: the safe state
          transition ('collection') and the semantic descriptor
          'contact'. Below is a single HTML document that shows both
          these elements in a representation.
        </t>
        <figure title="HTML ALPS Contact Representation">
          <artwork><![CDATA[
<html>
  <head>
    <link href="http://alps.io/profiles/contact"
      rel="profile" />
    <link href="http://alps.io/profiles/contact#contact"
      rel="type" />
    <link href="http://example.org/help/contacts.html"
      rel="help" />
  </head>
  <body>
    <form class="collection"
      method="get"
      action="http://example.org/contacts/">
      <label>Name:</label>
      <input name="nameSearch" value="" />
      <input type="submit" value="Search" />
    </form>

    <table>
      <tr class="contact">
        <td>
          <a href="http://example.org/contacts/1"
            rel="item">
            <span class="fullName">Ann Arbuckle</span>
          </a>
        </td>
        <td>
          <span class="email">aa@example.org</span>
        </td>
        <td>
          <span class="phone">123.456.7890</span>
        </td>
      </tr>

      <tr>
        <td>
          <a href="http://example.org/contacts/100"
            rel="item">
            <span class="fullName">Zelda Zackney</span>
          </a>
        </td>
        <td>
          <span class="email">zz@example.org</span>
        </td>
        <td>
          <span class="phone">098.765.4321</span>
        </td>
      </tr>
    </table>
  </body>
</html>
              ]]></artwork>
        </figure>
        <t>
          HTML representations implement most ALPS elements using
          HTML's 'class' attribute. The 'collection' ID has become the
          CSS class of an HTML form's submit button.
          The 'contact' ID has become the CSS class of the TR elements in an
          HTML table. The subordinate descriptors 'fullname','email', and
          'phone' are rendered as the TD elements of each TR.
        </t>
        <t>This HAL document uses the same profile to express the same
          application-level semantics as the HTML document.
        </t>
        <figure title="HAL XML Contacts Representation">
          <artwork><![CDATA[
<resource href="http://example.org/contacts/">
  <link href="http://alps.io/profiles/contacts#contact"
    rel="type" />
  <link href="http://example.org/help-file/contacts.html"
    rel="help" />
  <link rel="collection"
    href="http://example.org/contacts/{?nameSearch}"
    templated="true" />
  <resource rel="item" href="http://example.org/contacts/1">
    <link href="http://alps.io/profiles/contacts#contact"
      rel="type" />
    <fullName>Ann Arbuckle</fullName>
    <email>aa@example.org</email>
    <phone>123.456.7890</phone>
  </resource>
  <resource rel="item" href="http://example.org/contacts/100">
    <link href="http://alps.io/profiles/contacts#contact"
      rel="type" />
    <fullName>Zelda Zackney</fullName>
    <email>zz@example.org</email>
    <phone>987.664.3210</phone>
  </resource>
</resource>
                    ]]></artwork>
        </figure>
        <t>In a HAL representation, all state transitions
          ('collection' and 'item', in this case) are represented as
          link relations. All data descriptors ('fullName', 'email',
          and 'phone') are represented as XML tags named after the
          descriptors.
        </t>
        <t>This Collection+JSON document uses the ALPS profile to
          express the same application-level semantics as the HTML
          and HAL documents.
        </t>
        <figure title="Collection+JSON Contacts Representation">
          <artwork><![CDATA[
{
  "collection" : {
    "version" : "1.0",
    "href" : "http://example.org/contacts/",

    "links" : [
      {
        "rel" : "profile",
        "href" : "http://alps.io/profiles/contacts"
      },
      {
        "rel" : "help",
        "href" : "http://example.org/help/contacts.html"
      },
      {
        "rel" : "type",
        "href" : "http://alps.io/profiles/contacts#contact"
      }
    ],

    "queries" : [
      {
        "rel" : "collection",
        "rt" : "contact",
        "href" : "http://example.org/contacts/",
        "data" : [
          {
            "name" : "nameSearch",
            "value" : "",
            "prompt" :  "Search Name"
          }
        ]
      }
    ],

    "items" : [
      {
        "href" : "http://example.org/contacts/1",
        "rel" : "item",
        "rt" : "contact",
        "data" : [
          {"name" : "fullName", "value" : "Ann Arbuckle"},
          {"name" : "email", "value" : "aa@example.org"},
          {"name" : "phone", "value" : "123.456.7890"}
        ],
        "links" : [
          {
            "rel" : "type",
            "href" : "http://alps.io/profiles/contacts#contact"
          }
        ]
      },
      {
        "href" : "http://example.org/contacts/100",
        "rel" : "item",
        "rt" : "contact",
        "data" : [
          {
            "name" : "fullName",
            "value" : "Zelda Zackney"
          },
          {
            "name" : "email",
            "value" : "zz@example.org"
          },
          {
            "name" : "phone",
            "value" : "987.654.3210"
          }
        ],
        "links" : [
          {
            "rel" : "type",
            "href" : "http://alps.io/profiles/contacts#contact"
          }
        ]
      }
    ]
  }
}

               ]]></artwork>
        </figure>
        <t>The descriptor 'collection' has become the link
          relation associated with a Collection+JSON query. The
          descriptors 'fullName', 'email', and 'phone' have become
          the names of key-value pairs in the items in a
          Collection+JSON collection.
        </t>
      </section>
      <section title="Identifying an ALPS Document">
        <t>
          An ALPS vocabulary is identified by a unique URL.
          This URL SHOULD be dereferencable.
          All ALPS URLs MUST be unique and all ALPS documents
          intended for public consumption SHOULD be registered in
          an ALPS Registry [TK: add text on where/how to find
          registries -mamund].
        </t>
        <t>
          In order to reduce load on servers responding to
          ALPS document requests, it is RECOMMENDED that servers
          use cache control directives that instruct client
          apps to locally cache the results. Clients making
          these ALPS document requests SHOULD honor the
          server's caching directives.
        </t>
      </section>
    </section>
    <section title="ALPS Documents">
      <t>
        An ALPS document contains a machine-readable collection
        of identifying strings and their human-readable
        explanations. An ALPS document can be represented in
        either XML or JSON format. This section identifies the
        general elements and properties of an ALPS document,
        their meaning, and their use, independent of how the
        document is represented.
        <xref target="representations"/>
        provides specific details on
        constructing a valid ALPS document in XML and in JSON
        format.
      </t>
      <section title="Compliance">
        <t>
          An implementation is not compliant if it fails to
          satisfy one or more of the MUST or REQUIRED level
          requirements. An implementation that satisfies all
          the MUST or REQUIRED level and all the SHOULD level
          requirements is said to be 'unconditionally
          compliant'; one that satisfies all the MUST level
          requirements but not all the SHOULD level requirements
          is said to be 'conditionally compliant.'
        </t>
      </section>
      <section title="ALPS Document Properties">
        <t>
          The ALPS media type defines a small set of
          properties. These properties appear in both the XML
          and JSON formats. Below is a list of the properties
          that can appear in an ALPS document.
        </t>
        <section anchor="prop-alps" title="'alps'">
          <t>
            Indicates the root of the ALPS document. This
            property is REQUIRED, and it SHOULD have one or more
            <xref target="prop-descriptor" format="title"/>
            child properties.
          </t>
          <t>
            Examples:
            <list style="hanging">
              <t hangText="XML:">
                &lt;alps&gt;...&lt;/alps&gt;
              </t>
              <t hangText="JSON:">
                { "alps" : ... }
              </t>
            </list>
          </t>
        </section>
        <section anchor="prop-def" title="'def'">
          <t>
            Contains a valid IRI (see <xref target="RFC3987"/>) value that 
            idenfities the source definition of the descriptor. This is a 
            property of the <xref target="prop-descriptor" format="title"/> 
            element and it is OPTIONAL. It MAY or MAY NOT be dereferencable.
          </t>
          <t>
            Examples:
            <list style="hanging">
              <t hangText="XML:">
                &lt;descriptor id="title" def="http://schema.org/title" /&gt;
              </t>
              <t hangText="JSON:">
                { "descriptor" : [
                  {"id" : "title", "def":"http://schema.org/title" }
                ]}
              </t>
            </list>
          </t>
        </section>
        <section anchor="prop-descriptor" title="'descriptor'">
          <t>
            A 'descriptor' element defines the semantics of specific data elements or
            state transitions that MAY exist in an associated representation.
          </t>
          <t>
            One or more 'descriptor' elements
            SHOULD appear as children of <xref target="prop-alps" format="title"/>. It may also appear
            as a child of itself; that is, the 'descriptor'
            property may be nested. 
          </t>
          <t>
            The 'descriptor' element MAY be represented as a 
            single element or it MAY be represented as an array of 
            single elements.
          </t>
          <t>
            The 'descriptor' property SHOULD have either an
            <xref target="prop-id" format="title"/>
            or
            <xref target="prop-href" format="title"/>
            attribute. It MAY
            have both. Additionally, the 'descriptor' MAY have any
            of the following attributes:
            <list style="numbers">
              <t>
                <xref target="prop-def" format="title"/>
              </t>
              <t>
                <xref target="prop-doc" format="title"/>
              </t>
              <t>
                <xref target="prop-name" format="title"/>
              </t>
              <t>
                <xref target="prop-type" format="title"/>
              </t>
              <t>
                <xref target="prop-rel" format="title" />
              </t>
            </list>
          </t>
          <t>
            If present, the 'def' property SHOULD be a
            valid IRI (see <xref target="RFC3987"/>) which MAY or MAY NOT be
            dereferenceable.
          </t>
          <t>
            If present, the 'href' property MUST be a
            dereferenceable URL, that
            points to another 'descriptor' either within the
            current ALPS document or in another ALPS document.
          </t>
          <t>
            If 'descriptor' has an 'href' attribute, then
            'descriptor' is inheriting all the attributes and
            sub-properties of the descriptor pointed to by
            'href'. When 'descriptor' has a property defined
            locally, that property value takes precedence over
            any inherited property value. Since there is no
            limit to the nesting of elements -- even ones linked
            remotely -- it is important to process 'all
            descriptor' chains starting from the bottom to make
            sure you have collected all the available properties
            and have established the correct value for each of
            them.
          </t>
          <t>
            If 'descriptor' is declared at the top level of an ALPS document,
            then a client SHOULD assume that 'descriptor' can appear anywhere
            in a runtime message.
          </t>
          <t>If 'descriptor' is nested, i.e. declared
            as a child of another descriptor, then:
            <list style="numbers">
              <t>A client SHOULD assume them to appear in any
                sibling 'descriptor' element and recursively in their child descriptors.
              </t>
              <t>A client SHOULD NOT
                assume that it can appear anywhere outside of parent descriptor,
                unless it was explicitly referenced by another descriptor
                in 'href' attribute. In that case the same rules are applied to
                'descriptor' containing 'href' attribute.
              </t>
            </list>
          </t>
          <section  anchor="prop-descriptor-link-relations" title="'Descriptors and Link Relation Types'">
            <t>
              When a representation is generated that includes state transitions, valid values for link relation types are:
            </t>
            <t>
              <list style="numbers">
                <t>
                  A registered IANA link relation type (e.g. rel="edit", a short string).
                </t>
                <t>
                  An extension link relation type as defined by <xref target="RFC5988"/>
                  whose value is the fully-qualified URI of an associated document describing the
                  relation type. This includes URI fragment identifiers of ALPS descriptors
                  (e.g. rel="http://alps.io/profiles/item#purchased-by", a URI)
                  per the conventions of <xref target="prop-id-frag"/>.
                </t>
                <t>
                  The 'id' property of a state transition descriptor of an associated
                  ALPS document (e.g. rel="purchased-by", a short string) per the conventions
                  of section <xref target="prop-id-name"/> and <xref target="prop-id-rels"/>
                  if the representation includes an ALPS profile.
                </t>
              </list>
            </t>
          </section>
        </section>
        <section anchor="prop-doc" title="'doc'">
          <t>
            A text field that contains free-form, usually
            human-readable, text. The 'doc' element MAY be represented as a 
            single element or it MAY be represented as an array of 
            single elements. 
            The 'doc' element MAY have two properties:
            <xref target="prop-href" format="title"/>
            and
            <xref target="prop-format" format="title"/>.
            If the 'href' property appears it SHOULD contain a
            dereferencable URL that points to human-readable text. If
            the 'format' property appears it SHOULD contain one of the
            following values: 'text', 'html', 'asciidoc', or 'markdown'.
            Any program processing 'doc' elements SHOULD honor the
            'format' directive and parse/render the content
            appropriately. If the value in the 'format' property is not
            recognized and/or supported, the processing program MUST
            treat the content as plain text. If no 'format' property is
            present, the content SHOULD be treated as plain text.
            <list style="hanging">
              <t hangText="XML:"><![CDATA[
<doc format="html">
   <h1>Date of Birth</h1>
   <p>...</p>
</doc>
                        ]]></t>
              <t hangText="JSON:"><![CDATA[
{ "doc" :
  { "format" : "text" , "value" : "Date of Birth ..." }
}
                        ]]></t>
            </list>
          </t>
          <t>
            A 'doc' element SHOULD appear as a child of
            <xref target="prop-descriptor" format="title"/>. When
            present, it describes the meaning and use of the
            related 'descriptor'.
            <list style="hanging">
              <t hangText="XML:"><![CDATA[
<descriptor ... >
  <doc>...</doc>
</descriptor>
                        ]]></t>
              <t hangText="JSON:"><![CDATA[
{ "descriptor" : [
  { "doc" : { "value" : "..." }
    ...
  ]
}
                        ]]></t>
            </list>
          </t>
          <t>
            The 'doc' element MAY appear as a child of <xref target="prop-alps" format="title"/>. When present, it
            describes the purpose of the ALPS document as a
            whole.
            <list style="hanging">
              <t hangText="XML:"><![CDATA[
<alps>
  <doc>...</doc>
  ...
</apls>
                        ]]></t>
              <t hangText="JSON:"><![CDATA[
{
  "alps : {
	"doc" : { "value" : "..." }
  }
  ...
}
                        ]]></t>
            </list>
          </t>
        </section>
        <section anchor="prop-ext" title="'ext'">
          <t>
            The 'ext' element can be used to extend the ALPS
            document with author-specific information. It
            provides a way to customize ALPS documents with
            additional properties not covered in this
            specification. This is an OPTIONAL element.
          </t>
          <t>
            The 'ext' element MAY be represented as a 
            single element or it MAY be represented as an array of 
            single elements.  
          </t>
          <t>
            The 'ext' element has the following properties.
            <list style="numbers">
              <t>
                <xref target="prop-id" format="title"/>
              </t>
              <t>
                <xref target="prop-href" format="title"/>
              </t>
              <t>
                <xref target="prop-value" format="title"/>
              </t>
            </list>
          </t>
          <t>
            The
            <xref target="prop-id" format="title"/>
            property is REQUIRED.
            The
            <xref target="prop-href" format="title"/>
            is RECOMMENDED and
            it SHOULD point to documentation that explains the
            use and meaning of this
            <xref target="prop-ext" format="title"/>
            element.
            The
            <xref target="prop-value" format="title"/>
            property is OPTIONAL. The content is undetermined; its
            meaning and use SHOULD be explained by the document found
            by de-referencing the
            <xref target="prop-href" format="title"/>
            property.
          </t>
          <t>
            Examples:
            <list style="hanging">
              <t hangText="XML:">
                &lt;ext id="directions" href="http://alps.io/ext/directions"
                value="north south east west" &gt;
              </t>
              <t hangText="JSON:">
                { "ext" : { "id" : "directions", "href"
                : "http://alps.io/ext/directions",
                value="north south east west" } }
              </t>
            </list>
          </t>
          <t>
            The 'ext' element MAY appear as a child of the following
            elements:
            <list style="numbers">
              <t>
                <xref target="prop-alps" format="title"/>
              </t>
              <t>
                <xref target="prop-descriptor" format="title"/>
              </t>
            </list>
          </t>
          <t>
            Since the 'ext' element has no specific meaning
            within this specification, it MUST be ignored by any
            application that does not understand its meaning.
          </t>
        </section>
        <section anchor="prop-format" title="'format'">
          <t>
            Indicates how the text content should be parsed and/or
            rendered. This specification identifies a range of possible
            values for 'format':
            <list style="symbols">
              <t>'text', for plain text, MUST be supported.</t>
              <t>'html', for HTML, SHOULD be supported.</t>
              <t>'asciidoc', for AsciiDoc, MAY be supported.</t>
              <t>'markdown', per
              <xref target="I-D.ietf-appsawg-text-markdown">The text/markdown Media Type</xref>,
              MAY be supported.</t>
            </list>
            Any other values for this attribute are undefined and SHOULD
            be treated as plain text. If the program does not recognize
            the value of the 'format' property and/or the 'format'
            property is missing, the content SHOULD be treated as plain
            text.
          </t>
          <t>
            This property MAY appear as an attribute of the
            <xref target="prop-doc" format="title"/> element.
          </t>
        </section>
        <section anchor="prop-href" title="'href'">
          <t>
            Contains a resolvable URL.
          </t>
          <t>
            When it appears as an attribute of a <xref target="prop-descriptor" format="title"/>, 'href'
            points to another 'descriptor' either within the
            existing ALPS document as a fragment or in another ALPS document as an absolute URL. The URL MUST contain
            a fragment per <xref target="prop-id-frag"/> referencing the related 'descriptor'.
          </t>
          <t>
            When it appears as an attribute of <xref target="prop-ext" format="title"/>, 'href' points to an
            external document which provides the definition of
            the extension.
          </t>
          <t>
            When it appears as an attribute of
            <xref target="prop-link" format="title"/>,
            'href' points to an
            external document whose relationship to the current
            document or 'descriptor' is described by
            the associated
            <xref target="prop-rel" format="title"/>
            property.
          </t>
          <t>
            When it appears as an attribute of
            <xref target="prop-doc" format="title"/>, 'href' points to a
            document that contains human-readable text that describes
            the associated 'descriptor' or ALPS document.
          </t>
        </section>
        <section anchor="prop-id" title="'id'">
          <t>
            A document-wide unique identifier for the related
            element. This SHOULD appear as an attribute of a
            <xref target="prop-descriptor" format="title"/>. It SHOULD be an
            opaque string that does not contain any URL unsafe characters
            per <xref target="RFC1738"/>.
          </t>
          <t>
            The value of this attribute MAY be used as an identifier
            in the related runtime hypermedia representation. In the
            example below the ALPS descriptor with an 'id' of 'q' is
            used to identify an HTML input element:
            <list style="hanging">
              <t hangText="'id' in ALPS..."><![CDATA[
<descriptor id="q" type="semantic" />
                        ]]></t>
            </list>

            <list style="hanging">
              <t hangText="...becomes the 'class' in HTML"><![CDATA[
<input class="q" type="text" value="" />
                        ]]></t>
            </list>
          </t>
          <t>
            It should be noted that the exact mapping from ALPS elements (e.g. 'id')
            to elements within a particular media type (HTML, Collection+JSON, etc.)
            is covered in separate documents (to be specified).
          </t>
          <section anchor="prop-id-name" title="ALPS 'id' and 'name' Properties">
            <t>
              In some cases, media types support non-unique identifiers (e.g. HTML's 'name'
              property) or will allow the same identifier value for multiple elements in the same
              representation (e.g. &lt;div id="search" ... /&gt; and &lt;input type="submit" class="search" .../&gt; and
              &lt;input name="search" ... /&gt;). In those cases, translating that representation
              into ALPS documents could result in multiple 'id' properties with the same value.
            </t>
            <t>
              To avoid this, ALPS document designers can add the
              <xref target="prop-name" format="title"/>
              property to a 'descriptor' to hold the common value ('search') while still using the
              <xref target="prop-id" format="title"/>
              property to hold a document-wide unique value. For example:
            </t>
            <figure title="HTML Representation of a Search Transition">
              <artwork><![CDATA[
<!-- HTML -->
<div id="search">
  <form action="..." method="get">
    <input name="search" value="..." type="text" />
    <input type="submit" class="search" />
  </form>
</div>
          ]]></artwork>
            </figure>
            <figure title="ALPS Description of the same Search Transition">
              <artwork><![CDATA[
<!-- ALPS -->
<descriptor id="search-block" type="semantic" name="search">
  <descriptor id="search-form" type="safe" name="search">
    <descriptor id="search-data" type="semantic" name="search" />
  </descriptor>
</descriptor>
          ]]></artwork>
            </figure>
          </section>
          <section anchor="prop-id-frag" title="Fragment Identifiers and 'id'">
            <t>
              When applied to an ALPS document, a URI fragment
              identifier points to the 'descriptor' whose
              'id' is the value of the fragment. For example, the fragment
              identifier 'customer' in the URI
              http://example.com/my-alps-document#customer refers to an ALPS
              'descriptor' with 'id' set to 'customer'. If the <xref target="prop-id" format="title"/>
              contains URL unsafe characters per <xref target="RFC1738"/>, the
              fragment referencing the 'id' MUST be URL escaped.
            </t>
            <t>
              A relative URL with a fragment identifier within an ALPS document
              (e.g. href="#customer") refers to a local 'descriptor' within the
              document containing the reference.
            </t>
            <t>
              The complete URI to an ALPS 'descriptor' (including the
              fragment) forms an 'abstract semantic type'
              identifier. This is a resolvable URI (URL) that can
              be used to indicate the type of a resource; for
              instance, it can be used as the value of the
              IANA-registered relation type 'type'.
            </t>
          </section>
          <section anchor="prop-id-rels" title="Link Relation Values and 'id' or 'name'">
            <t>
              Since a state transition 'descriptor' may define a relation type value,
              it is important to avoid creating conflicts with existing IANA-registered
              values. If the resulting link relation type is the same as a
              registered relation type, the descriptor MUST not change the meaning of the
              IANA relation type.
            </t>
            <t>
              Further, since the 'id' of a 'descriptor' may define a link relation value per
              <xref target="prop-descriptor-link-relations"/>, if a conflict exists in defining
              such a descriptor's document-wide unique 'id' with
              another 'descriptor', the conflicting 'descriptor' MUST define a unique 'id' and MAY specify a
              'name' property to resolve the conflict.
            </t>
            <t>
              If it is unclear whether a registered link relation type in a representation
              document refers to a relation registered with IANA or a relation registered
              in an ALPS profile, the semantics of that link are undefined.
            </t>
          </section>
        </section>
        <section anchor="prop-link" title="'link'">
          <t>
            An element that identifies a link between the current ALPS element and some
            other (possibly external) resource. MAY be a child element of the
            <xref target="prop-alps" format="title"/>
            and the
            <xref target="prop-descriptor" format="title"/>
            elements.
          </t>
          <t>
            The 'link' element MAY be represented as a 
            single element or it MAY be represented as an array of 
            single elements.  
          </t>
          <t>
            The 'link' element MUST define the two attributes
            <xref target="prop-href" format="title"/>
            and
            <xref target="prop-rel" format="title"/>.
          </t>
          <t>
            The 'link' element MAY have a <xref target="prop-title" format="title"/> attribute.
          </t>
        </section>
        <section anchor="prop-name" title="'name'">
          <t>
            Indicates the name of the
            <xref target="prop-descriptor" format="title"/>
            as
            found in generic representations. It MAY appear as a
            property of 'descriptor'.
          </t>
          <t>
            This is used when the name of the 'descriptor'
            is used as an
            <xref target="prop-id" format="title"/>
            value elsewhere in the
            ALPS document. For instance, if a single ALPS
            document defines a semantic descriptor (data element) called
            'customer' and a safe descriptor (transition element) also called
            'customer', they cannot both have 'id="customer"' in
            the ALPS document. One of them needs to have some
            other 'id', and to set 'name="customer"'.
          </t>
          <t>
            The use of the 'name' property usually indicates an
            ambiguity in the application semantics. Thus, it
            SHOULD only be used when creating an ALPS profile
            that describes an existing design.
          </t>
        </section>
        <section anchor="prop-rel" title="'rel'">
          <t>
            Contains a
            <xref target="RFC5988"/>
            approved
            value: either an extension relation type (a URI)
            or a registered relation type (a short string).
          </t>
          <t>
              Appears as a property of <xref target="prop-link" format="title"/> and 
              <xref target="prop-descriptor" format="title" />.
          </t>
        </section>
        <section anchor="prop-rt" title="'rt'">
          <t>
            Indicates the kind of resource that will be returned when
            executing the specified network request. The 'rt' attribute
            SHOULD appear only on a
            <xref target="prop-descriptor" format="title"/>
            with a
            <xref target="prop-type" format="title"/>
            value of
            'safe', 'unsafe', or 'idempotent.'
          </t>
          <t>
            The 'rt' attribute is OPTIONAL and, when it appears, it MUST point to
            the <xref target="prop-id" format="title" /> of an existing
            <xref target="prop-descriptor" format="title" /> using one of two methods:
            <list style="numbers">
              <t>
                A fragment identifier (e.g. rt="#friend") which points
                to the <xref target="prop-id" format="title"/>
                of an existing <xref target="prop-descriptor" format="title"/>
                in the current ALPS document.
              </t>
              <t>
                A resolvable URL with a fragment identifier (e.g. rt="http://example.org/profiles/people#friend")
                which points to the <xref target="prop-id" format="title"/>
                of an existing <xref target="prop-descriptor" format="title"/> in any
                valid ALPS document.
              </t>
            </list>
          </t>
        </section>
        <section anchor="prop-title" title="'title'">
          <t>
            The 'title' can appear as a root element (as a child of 
            <xref target="prop-alps" format="title"/>) or as a property of 
            <xref target="prop-descriptor" format="title" /> or
            <xref target="prop-link" format="title"/>. 
          </t>
          <t>
            The value of `title` contains a single human-readable text string.
          </t>
          <figure title="XML Example">
            <artwork><![CDATA[
<?xml version="1.0"?>
  <alps version="1.0">
  <title>Search Profile</title>
  <doc href="http://example.org/samples/full/doc.html" />

  <descriptor id="search" type="safe" title="Search for a profile.">
    ...
  </descriptor>
</alps>
         ]]></artwork>
          </figure>
        </section>
        <section anchor="prop-type" title="'type'">
          <t>
            Indicates the type of hypermedia control to which
            the element is applied within the resulting representation.
            This SHOULD appear for each
            <xref target="prop-descriptor" format="title"/> element.
            The four valid values are:

            <list style="hanging">
              <t hangText="'semantic'">
                A state element (e.g. HTML.SPAN, HTML.INPUT,
                etc.).
              </t>
              <t hangText="'safe'">
                A hypermedia control that triggers a safe,
                idempotent state transition (e.g. HTTP.GET or
                HTTP.HEAD).
              </t>
              <t hangText="'idempotent'">
                A hypermedia control that triggers an unsafe,
                idempotent state transition (e.g. HTTP.PUT or
                HTTP.DELETE).
              </t>
              <t hangText="'unsafe'">
                A hypermedia control that triggers an unsafe,
                non-idempotent state transition (e.g. HTTP.POST).
              </t>
            </list>

            If no 'type' attribute is associated with the
            element, then 'type="semantic"' is implied.
          </t>
        </section>
        <section anchor="prop-value" title="'value'">
          <t>
            Contains a string value. It MAY appear as an attribute
            of the
            <xref target="prop-doc" format="title"/>
            and the
            <xref target="prop-ext" format="title"/>
            elements.
          </t>
        </section>
        <section anchor="prop-version" title="'version'">
          <t>
            Indicates the version of the ALPS specification used
            in the document. This SHOULD appear as a property of
            the
            <xref target="prop-alps" format="title"/>
            element.
            Currently
            the only valid value is '1.0'. If no value appears,
            then '1.0' is implied.
          </t>
        </section>
      </section>
      <section anchor="representations" title="ALPS Representations">
        <t>
          An ALPS document may be represented in either XML or JSON
          format. This section contains notes on how the ALPS
          elements and attributes appear in each format, along with
          examples to guide ALPS document authors.
        </t>
        <section anchor="html-representation" title="Sample HTML">
          <t>
            Below is a simple HTML document that contains a handful
            of semantic descriptors and transition instructions.
            This document was generated from the XML and JSON ALPS
            documents that follow. Use this HTML document as a guide
            when evaluating the XML and JSON examples.

            <figure title="HTML Sample">
              <artwork><![CDATA[
<!-- sample HTML document -->
<html>
  <head>
    <link rel="profile" href="http://alps.io/documents/search" />
  </head>
  <body>
    <form class="search" action="..." method="get">
      <input type="text" name="search" value="..." />
        <select name="resultType">
          <option value="summary" />
          <option value="detailed" />
        </select>
      <input type="submit" />
    </form>
  </body>
</html>
                        ]]></artwork>
            </figure>
          </t>
        </section>
        <section anchor="xml-representation" title="XML Representation Example">
          <t>
            In the XML version of an ALPS document, the following
            ALPS properties always appear as XML elements: <xref target="prop-alps" format="title"/>, <xref
                  target="prop-doc" format="title"/>, <xref target="prop-descriptor" format="title"/>, and <xref
                  target="prop-ext" format="title"/>. All other ALPS
            properties appear as XML attributes.
          </t>
          <section title="Complete XML Representation">
            <t>
              Below is an example of an application/alps+xml
              representation.
            </t>
            <figure title="Complete XML Representation">
              <artwork><![CDATA[
<?xml version="1.0"?>
<alps version="1.0">
  <doc href="http://example.org/samples/full/doc.html" />

  <descriptor id="search" type="safe">
    <doc format="text">A search form with two inputs.</doc>
    <descriptor href="#resultType" />
    <descriptor id="value" name="search" type="semantic">
      <doc>input for search</doc>
    </descriptor>
  </descriptor>

  <descriptor id="resultType" type="semantic">
    <doc>results format</doc>
    <ext
      href="http://alps.io/ext/range"
      value="summary,detail" />
  </descriptor>
</alps>
                          ]]></artwork>
            </figure>
          </section>
        </section>
        <section anchor="json-representation" title="JSON Representation Example">
          <t>
            When representing ALPS documents in JSON format,
            the
            <xref target="prop-descriptor" format="title"/>
            and
            <xref target="prop-ext" format="title"/>
            properties are
            always expressed as arrays of anonymous objects - even
            when there is only one member in the array.

            <figure title="Arrays in ALPS+JSON">
              <preamble>For example:</preamble>
              <artwork><![CDATA[
"descriptor" : [
  {
    "id" : "value",
    "name" : "search",
    "type" : "semantic",
    "doc" : { "value" : "input for search" }
  },
  { "href" : "#resultType" }
]
              ]]></artwork>
            </figure>
          </t>
          <t>
            The
            <xref target="prop-doc" format="title"/>
            property is always expressed as a named object.
          </t>
          <t>
            <figure title="Descriptions in ALPS+JSON">
              <preamble>For example:</preamble>
              <artwork><![CDATA[
{
  "doc" : {
    "format" : "text",
    "value" : "Rules are important"
  }
}
              ]]></artwork>
            </figure>
          </t>
          <section title="Complete JSON Representation">
            <t>
              Below is a example of the application/alps+json
              representation of an ALPS document.
            </t>
            <figure title="Complete ALPS+JSON Representation">
              <artwork><![CDATA[
{
  "alps" : {
    "version" : "1.0",
    "doc" : {
      "href" : "http://example.org/samples/full/doc.html"
    },
    "descriptor" : [
      {
        "id" : "search",
        "type" : "safe",
        "doc" : { "value" :
          "A search form with a two inputs"
        },
        "descriptor" : [
          {
            "id" : "value",
            "name" : "search",
            "type" : "semantic",
            "doc" : { "value" : "input for search" }
          },
          { "href" : "#resultType" }
        ]
      },
      {
        "id" : "resultType",
        "type" : "semantic",
        "doc" : { "value" : "results format"},
        "ext" : [
          {
            "href" : "http://alps.io/ext/range",
            "value" : "summary,detail"
          }
        ]
      }
    ]
  }
}
                          ]]></artwork>
            </figure>
          </section>
        </section>
      </section>
    </section>
    <section anchor="instructions" title="Applying ALPS documents to Existing Media Types">
      <t>
        An ALPS document can be applied to many existing media
        types as long as there exists an agreed mapping between ALPS and the target
        media type.
        <!-- [TK: point to future mapping documentation] -->
        <xref target="example"/>
        gave some informative
        examples of this. Normative, up-to-date guidance on applying
        ALPS documents to existing media types are available at the
        official ALPS Web site at (http://alps.io/docs/mapping). [TK : this
        page does not yet exist. -mamund]
      </t>
      <t>
        <!--
        [TK just brainstorming here, not formatted. -LR]
        Defining how an ALPS document is to be applied to a media type
        requires defining the following:

        * How to mark up a state element in the representation with
        the name of a ALPS element that sets
        type="descriptor". (Informative example: in an HTML
        representation, any HTML tag that supports the "class"
        attribute may use the name [or URI? -leonardr] of any such
        ALPS element as one value for the "class" attribute. In an
        HTML 5 representation with microdata, any HTML tag may use the
        name or URI of any such ALPS element as one value for the
        "itemprop" attribute.)

        * How to mark up a hypermedia control in the representation
        with the name of an ALPS element that sets type="descriptor"
        or type="safe". (Informative example: in an HTML
        representation, any HTML tag that supports the "rel"
        attribute" ("a", "link", etc.) may use the name or URI of any
        such ALPS element as the value for the "rel" attribute. A
        "form" tag that sets method="GET" may use the name or URI of
        any such ALPS element as one value for the "class" attribute
        of any of its "submit" tags.)

        * How to mark up a hypermedia control with the name of an ALPS
        element that sets type="idempotent". (Informative example: in
        an HTML representation, a "form" tag that sets method="POST"
        may use the name or URI of any such ALPS element as one value
        for the "class" attribute of any of its "submit" tags.)

        * How to mark up a hypermedia control with the name of an ALPS
        element that sets type="unsafe". (Informative example: in
        an HTML representation, an HTML "submit" tag may use the name
        or URI of any such ALPS element as one value for the "class"
        attribute.)

        * How to represent the relationship between an enclosing ALPS
        descriptor and the descriptor it encloses. (Informative
        example: in an HTML representation, a tag marked up as an ALPS
        descriptor may contain a child tag marked up as one of the
        children of that ALPS descriptor.)
-->
      </t>
      <t>
        Not all media types can faithfully represent all ALPS
        descriptors. For instance, the 'application/json' media type
        has no standard way of representing hyperlinks. The details of how to
        apply ALPS to such a media type will necesarily be incomplete,
        and it will not be possible to represent some aspects of an
        ALPS profile in documents in that media type.
        <!--
                [TK could we
                say that such a media type is not in complete compliance with
                the ALPS document?  -leonardr] :: [we might want to add a compliance
                section in this spec. IOW, what parts of ALPS a media type
                MUST/SHOULD/MAY support in order to be "fully compliant" (all MUSTs
                and SHOULDs, "conditionally compliant" (all MUSTs), and "non-compliant"
                (not all MUSTs) -mca] -->

      </t>
      <section anchor="linking-to-alps-documents" title="Linking to ALPS Documents">
        <t>
          To indicate that an ALPS profile describes the semantics of
          some representation document, the representation document
          SHOULD be linked to the ALPS document. The 'profile'
          link relation <xref target="RFC6906" /> MUST be used when creating this link.
          If the media type of the representation
          document has no native ability to link to other resources,
          or no ability to express link relations, the HTTP header
          'Link'
          <xref target="RFC5988"/>
          MAY be used to connect the
          representation document and the ALPS profile. If the media
          type of the representation document defines a parameter for
          linking the document to a profile, that parameter MAY be
          used to connect the representation document and the ALPS
          profile.
        </t>
        <t>
          A single representation document may be described by more
          than one ALPS profile. If two ALPS profiles give conflicting
          semantics for the same element, the document linked to
          earlier in the representation SHOULD take precedence. A
          profile linked to using the 'Link' header takes precedence
          over a profile linked to within the representation document
          itself. A profile linked to using a media type parameter
          takes precedence over a profile linked to using the 'Link'
          header and a profile linked to within the representation
          document itself.
        </t>
      </section>
    </section>
    <section anchor="iana-considerations" title="IANA Considerations">
      <t>
        This specification establishes two media types:
        'application/alps+xml' and 'application/alps+json'
      </t>
      <section anchor="iana-alps-xml" title="application/alps+xml">
        <t>
          <list style="hanging">
            <t hangText="Type name:">
              application
            </t>
            <t hangText="Subtype name:">
              alps+xml
            </t>
            <t hangText="Required parameters:">
              None
            </t>
            <t hangText="Optional parameters:">
              <list style="hanging">
                <t hangText="charset">
                  This parameter has identical semantics to the
                  charset parameter of the 'application/xml'
                  media type as specified in<xref target="RFC3023"/>.
                </t>
                <t hangText="profile">
                  A whitespace-separated list of IRIs identifying specific
                  constraints or conventions that apply to an ALPS document.
                  A profile must not change the semantics of the resource
                  representation when processed without profile knowledge, so
                  that clients both with and without knowledge of a profiled
                  resource can safely use the same representation. The profile
                  parameter may also be used by clients to express their
                  preferences in the content negotiation process. It is
                  recommended that profile IRIs are dereferenceable and provide
                  useful documentation at that IRI.
                </t>
              </list>
            </t>
            <t hangText="Encoding considerations:">
              <list style="hanging">
                <t hangText="binary">
                  Same as encoding considerations of
                  application/xml as specified in<xref target="RFC3023"/>.
                </t>
              </list>
            </t>
            <t hangText="Security considerations:">
              This format shares security issues common to all XML
              content types. It does not provide executable content.
              Information contained in ALPS documents do not
              require privacy or integrity services.
            </t>
            <t hangText="Interoperability considerations:">
              ALPS is not described by a DTD and applies only
              the well-formedness rules of XML. It should only
              be parsed by a non-validating parser.
            </t>
            <t hangText="Fragment identifier considerations:">
              Fragment identifiers used with application/alps+xml resources are simple, opaque strings
              that do not contain any URL unsafe characters per <xref target="RFC1738"/>
              which match the <xref target="prop-id" format="title" /> in an existing
              <xref target="prop-descriptor" format="title" /> in the document. For example, the
              fragment identifier "#user" refers to a descriptor in the document with an id value
              set to "user."
            </t>
            <t hangText="Published specification:">
              This Document
            </t>
            <t hangText="Applications that use this media type:">
              Various
            </t>
            <t hangText="Additional information:">
              <list style="hanging">
                <t hangText="magic number(s):">
                  none
                </t>
                <t hangText="file extensions:">
                  .xml
                </t>
                <t hangText="macintosh type file code:">
                  TEXT
                </t>
                <t hangText="object idenfiers:">
                  none
                </t>
              </list>
            </t>
            <t hangText="person to contact for further information:">
              <list style="hanging">
                <t hangText="Name:">
                  Mike Amundsen
                </t>
                <t hangText="Email:">
                  mca@amundsen.com
                </t>
              </list>
            </t>
            <t hangText="Intended usage:">
              Common
            </t>
            <t hangText="Author/change controller:">
              Mike Amundsen
            </t>
          </list>
        </t>
      </section>
      <section anchor="iana-alps-json" title="application/alps+json">
        <t>
          <list style="hanging">
            <t hangText="Type name:">
              application
            </t>
            <t hangText="Subtype name:">
              alps+json
            </t>
            <t hangText="Required parameters:">
              None
            </t>
            <t hangText="Optional parameters:">
              <list style="hanging">
                <t hangText="profile">
                  A whitespace-separated list of IRIs identifying specific
                  constraints or conventions that apply to an ALPS document.
                  A profile must not change the semantics of the resource
                  representation when processed without profile knowledge, so
                  that clients both with and without knowledge of a profiled
                  resource can safely use the same representation. The profile
                  parameter may also be used by clients to express their
                  preferences in the content negotiation process. It is
                  recommended that profile IRIs are dereferenceable and provide
                  useful documentation at that IRI.
                </t>
              </list>
            </t>
            <t hangText="Encoding considerations:">
              binary
            </t>
            <t hangText="Security considerations:">
              This media type shares security issues common to all
              JSON content types. See
              <xref target="RFC4627"/>
              Section
              #6 for additional information. ALPS+JSON does not
              provide executable content. Information contained in
              ALPS+JSON documents do not require privacy or integrity
              services.
            </t>
            <t hangText="Interoperability considerations:">
              None
            </t>
            <t hangText="Fragment identifier considerations:">
              Fragment identifiers used with application/alps+json resources are simple, opaque strings
              that do not contain any URL unsafe characters per <xref target="RFC1738"/>
              which match the <xref target="prop-id" format="title" /> in an existing
              <xref target="prop-descriptor" format="title" /> in the document. For example, the
              fragment identifier "#user" refers to a descriptor in the document with an id value
              set to "user."
            </t>
            <t hangText="Published specification:">
              This Document
            </t>
            <t hangText="Applications that use this media type:">
              Various
            </t>
            <t hangText="Additional information:">
              <list style="hanging">
                <t hangText="magic number(s):">
                  none
                </t>
                <t hangText="file extensions:">
                  .json
                </t>
                <t hangText="macintosh type file code:">
                  TEXT
                </t>
                <t hangText="object idenfiers:">
                  none
                </t>
              </list>
            </t>
            <t hangText="person to contact for further information:">
              <list style="hanging">
                <t hangText="Name:">
                  Mike Amundsen
                </t>
                <t hangText="Email:">
                  mca@amundsen.com
                </t>
              </list>
            </t>
            <t hangText="Intended usage:">
              Common
            </t>
            <t hangText="Author/change controller:">
              Mike Amundsen
            </t>
          </list>
        </t>
      </section>
    </section>
    <section anchor="internationalization" title="Internationalization Considerations">
      <t>[TK]</t>
      <t>
        <cref>insert text (consider rfc 5987)</cref>
      </t>
    </section>
    <section title="Acknowledgements">
      <t>
        The authors gratefully acknowledge the following people who made contributions to this specification:
      </t>
      <t>
        Glenn Block,
        Christopher Harrison,
	      Steve Klabnik,
	      Filip Kolarik,
	      Akihito Koriyama,
	      Graham Klyne,
	      Dmitry Pavlov,
        Rémon (Ray) Sinnema.
      </t>
    </section>
  </middle>
  <!-- back matter -->
  <back>
    <references title="Normative References">
      &rfc1738;
      &rfc2119;
      &rfc3023;
      &rfc3987;
      &rfc4627;
      &rfc5988;
      &rfc6906;
      &rfc7320;
    </references>
    <references title="Informative References">
      <?rfc include="reference.I-D.ietf-appsawg-text-markdown.xml"?>
    </references>
    <section title="Frequently Asked Questions">
      <section title="Why are there no URLs in ALPS?">
        <t>
          ALPS is meant to describe a service in a universal way. The same ALPS description document
          can be used by many ALPS-compliant servers. Since each service implementation is in charge
          of their own URL space, ALPS descriptions do not include URLs.
          See
          <xref target="RFC7320">URI Design and Ownership</xref>
          for more on this principle.
        </t>
        <t>
          When implementing ALPS-compliant servers, implementors are free to use any URL design they wish.
          All that is required is that implementors use the same ALPS profile descriptor 'id' and 'name'
          properties in the representations. When implementing ALPS-compliant client applications, the
          URLs will be supplied at runtime by the server representations. Client apps only need to
          recognize the descriptor 'id' and 'name' values from the referenced ALPS profile document.
        </t>
      </section>
      <section title="Why is there no workflow component in the ALPS specification?">
        <t>
          ALPS is not designed to describe workflows or execution paths for a service. Instead, ALPS
          is designed to describe a shared set of data and actions elements that server MAY implement
          in order to create a service. Each action descriptor (where the descriptor's type property is set to
          'safe', 'unsafe', or 'idemponent') SHOULD describe a state transition that a
          ALPS-compliant client application can invoke when it is available. Servers are free to
          implement the transitions they find useful and to arrange them in any order they wish.
          ALPS-compliant client applications SHOULD be able to recognize these descriptors when they appear
          and are free to act upon them directly, render them for humans to invoke, or ignore/hide them
          completely.
        </t>
      </section>
      <section title="Why is there no way to indicate ranges for semantic descriptors?">
        <t>
          For most all service implementations, there are cases where it would be helpful to document
          a range of possible values for a semantic element. For example, when implementing the descriptor
          {"id":"size", ...}, one service might want to indicate the list of supported values such as:
          'small', 'meduim', 'large', etc. However, another service might have a very different list of
          possible values such as 'standard', 'oversized', 'undersized', etc. And there may be a service
          that only supports a single value here and will always supply it ('onesize').
        </t>
        <t>
          Since ALPS is meant to provide a single description that can be used by multiple services,
          establishing ranges within the ALPS description is considered over-constraining
          service implementations. Services are free to supply this information within representations
          at run time. But including them in the global ALPS profile is discouraged.
        </t>
      </section>
    </section>
  </back>
</rfc>
