<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.39 (Ruby 3.2.1) -->
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-jsonpath-base-16" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocDepth="4" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="JSONPath">JSONPath: Query expressions for JSON</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-base-16"/>
    <author initials="S." surname="Gössner" fullname="Stefan Gössner" role="editor">
      <organization>Fachhochschule Dortmund</organization>
      <address>
        <postal>
          <street>Sonnenstraße 96</street>
          <city>Dortmund</city>
          <code>D-44139</code>
          <country>Germany</country>
        </postal>
        <email>stefan.goessner@fh-dortmund.de</email>
      </address>
    </author>
    <author initials="G." surname="Normington" fullname="Glyn Normington" role="editor">
      <organization/>
      <address>
        <postal>
          <street/>
          <city>Winchester</city>
          <region/>
          <code/>
          <country>UK</country>
        </postal>
        <phone/>
        <email>glyn.normington@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2023"/>
    <area>ART</area>
    <workgroup>JSONPath WG</workgroup>
    <keyword>JSON</keyword>
    <abstract>
      <?line 139?>

<t>JSONPath defines a string syntax for selecting and extracting JSON (RFC 8259) values
from a JSON value.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-jsonpath-base/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        JSON Path Working Group mailing list (<eref target="mailto:jsonpath@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/jsonpath/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/jsonpath/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-jsonpath/draft-ietf-jsonpath-base"/>.</t>
    </note>
  </front>
  <middle>
    <?line 144?>

<!-- define an ALD to simplify below -->
<!-- use as {: unnumbered} -->

<!-- editorial issue: lots of complicated nesting of quotes, as in -->
<!-- `"13 == '13'"` or `$`.  We probably should find a simpler style -->

<section anchor="introduction">
      <name>Introduction</name>
      <t>JSON <xref target="RFC8259"/> is a popular representation
format for structured data values.
JSONPath defines a string syntax for selecting and extracting JSON values
from a JSON value.</t>
      <t>JSONPath is not intended as a replacement for, but as a more powerful
companion to, JSON Pointer <xref target="RFC6901"/>. See <xref target="json-pointer"/>.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>The grammatical rules in this document are to be interpreted as ABNF,
as described in <xref target="RFC5234"/>.
ABNF terminal values in this document define Unicode code points rather than
their UTF-8 encoding.
For example, the Unicode PLACE OF INTEREST SIGN (U+2318) would be defined
in ABNF as <tt>%x2318</tt>.</t>
        <t>Functions are referred to using the function name followed by a pair
of parentheses, as in <tt>fname()</tt>.</t>
        <t>The terminology of <xref target="RFC8259"/> applies except where clarified below.
The terms "Primitive" and "Structured" are used to group
different kinds of values as in <xref section="1" sectionFormat="of" target="RFC8259"/>; JSON Objects and Arrays are
structured, all other values are primitive.
Definitions for "Object", "Array", "Number", and "String" remain
unchanged.
Importantly "object" and "array" in particular do not take on a
generic meaning, such as they would in a general programming context.</t>
        <t>Additional terms used in this document are defined below.</t>
        <dl>
          <dt>Value:</dt>
          <dd>
            <t>As per <xref target="RFC8259"/>, a structure conforming to the generic data model of JSON, i.e.,
composed of constituents such as structured values, namely JSON objects and arrays, and
primitive data, namely numbers and text strings as well as the special
values null, true, and false.
<xref target="RFC8259"/> focuses on the textual representation of JSON values and
does not fully define the value abstraction assumed here.</t>
          </dd>
          <dt>Member:</dt>
          <dd>
            <t>A name/value pair in an object.  (A member is not itself a value.)</t>
          </dd>
          <dt>Name:</dt>
          <dd>
            <t>The name (a string) in a name/value pair constituting a member.
This is also used in <xref target="RFC8259"/>, but that specification does not
formally define it.
It is included here for completeness.</t>
          </dd>
          <dt>Element:</dt>
          <dd>
            <t>A value in a JSON array.</t>
          </dd>
          <dt>Index:</dt>
          <dd>
            <t>An integer that identifies a specific element in an array.</t>
          </dd>
          <dt>Query:</dt>
          <dd>
            <t>Short name for a JSONPath expression.</t>
          </dd>
          <dt>Query Argument:</dt>
          <dd>
            <t>Short name for the value a JSONPath expression is applied to.
(Also used for actual parameters of function-expressions.)</t>
          </dd>
          <dt>Location:</dt>
          <dd>
            <t>the position of a value within the query argument. This can be thought of
as a sequence of names and indexes navigating to the value through
the objects and arrays in the query argument, with the empty sequence
indicating the query argument itself.
A location can be represented as a Normalized Path (defined below).</t>
          </dd>
          <dt>Node:</dt>
          <dd>
            <t>The pair of a value along with its location within the query argument.</t>
          </dd>
          <dt>Root Node:</dt>
          <dd>
            <t>The unique node whose value is the entire query argument.</t>
          </dd>
          <dt>Root Node Identifier:</dt>
          <dd>
            <t>The expression <tt>$</tt> which refers to the root node of the query argument.</t>
          </dd>
          <dt>Current Node Identifier:</dt>
          <dd>
            <t>The expression <tt>@</tt> which refers to the current node in the context
of the evaluation of a filter expression (described later).</t>
          </dd>
          <dt>Children (of a node):</dt>
          <dd>
            <t>If the node is an array, the nodes of its elements.
If the node is an object, the nodes of its member values.
If the node is neither an array nor an object, it has no children.</t>
          </dd>
          <dt>Descendants (of a node):</dt>
          <dd>
            <t>The children of the node, together with the children of its children, and so forth
recursively. More formally, the descendants relation between nodes is the transitive
closure of the children relation.</t>
          </dd>
          <dt>Depth (of a descendant node within a value):</dt>
          <dd>
            <t>The number of ancestors of the node within the value. The root node of the value has depth zero,
the children of the root node have depth one, their children have depth two, and so forth.</t>
          </dd>
          <dt>Nodelist:</dt>
          <dd>
            <t>A list of nodes.
While a nodelist can be represented in JSON, e.g. as an array, this document
does not require or assume any particular representation.</t>
          </dd>
          <dt>Parameter:</dt>
          <dd>
            <t>Formal parameter (of a function) that can take a function argument
(an actual parameter) in a function-expression.</t>
          </dd>
          <dt>Normalized Path:</dt>
          <dd>
            <t>A form of JSONPath expression that identifies a node in a value by
providing a query that results in exactly that node.  Each node in a
query argument is identified by exactly one Normalized Path (we say, the
Normalized Path is "unique" for that node), and, to be a Normalized
Path for a specific query argument, the Normalized Path needs to identify
exactly one node. Similar
to, but syntactically different from, a JSON Pointer <xref target="RFC6901"/>.
Note: This definition is based on the syntactical definition in <xref target="normalized-paths"/>;
JSONPath expressions that identify a node in a value but do not conform to that
syntax are not Normalized Paths.</t>
          </dd>
          <dt>Unicode Scalar Value:</dt>
          <dd>
            <t>Any Unicode <xref target="UNICODE"/> code point except high-surrogate and low-surrogate code points.
In other words, integers in either of the inclusive base 16 ranges 0 to D7FF and
E000 to 10FFFF. JSONPath queries are sequences of Unicode scalar values.</t>
          </dd>
          <dt>Segment:</dt>
          <dd>
            <t>One of the constructs which select children (<tt>[&lt;selectors&gt;]</tt>)
or descendants (<tt>..[&lt;selectors&gt;]</tt>) of an input value.</t>
          </dd>
          <dt>Selector:</dt>
          <dd>
            <t>A single item within a segment that takes the input value and produces a nodelist
consisting of child nodes of the input value.</t>
          </dd>
          <dt>Singular Query:</dt>
          <dd>
            <t>A JSONPath expression built from segments that have been syntactically restricted in
a certain way (<xref target="filter-selector-syntax"/>) so that, regardless of the input
value, the expression produces a nodelist containing at most one node.
Note: JSONPath expressions that always produce a singular nodelist but do not
conform to the syntax in <xref target="filter-selector-syntax"/> are not Singular Queries.</t>
          </dd>
        </dl>
        <section anchor="json-values-as-trees-of-nodes">
          <name>JSON Values as Trees of Nodes</name>
          <t>This document models the query argument as a tree of JSON values, each
with its own node.
A node is either the root node or one of its descendants.</t>
          <t>This document models the result of applying a query to the
query argument as a nodelist (a list of nodes).</t>
          <t>Nodes are the selectable parts of the query argument.
The only parts of an object that can be selected by a query are the
member values. Member names and members (name/value pairs) cannot be
selected.
Thus, member values have nodes, but members and member names do not.
Similarly, member values are children of an object, but members and
member names are not.</t>
        </section>
      </section>
      <section anchor="history">
        <name>History</name>
        <t>This document is based on <contact fullname="Stefan Gössner"/>'s popular JSONPath proposal
dated 2007-02-21 <xref target="JSONPath-orig"/>, builds on the experience from the widespread
deployment of its implementations, and provides a normative specification for it.</t>
        <t><xref target="inspired-by-xpath"/> describes how JSONPath was inspired by XML's XPath
<xref target="XPath"/>.</t>
        <t>JSONPath was intended as a light-weight companion to JSON
implementations in programming languages such as PHP and JavaScript,
so instead of defining its own expression language, like XPath did,
JSONPath delegated parts of a query to the underlying
runtime, e.g., JavaScript's <tt>eval()</tt> function.
As JSONPath was implemented in more environments, JSONPath
expressions became decreasingly portable.
For example, regular expression processing was often delegated to a
convenient regular expression engine.</t>
        <t>This document aims to remove such implementation-specific dependencies and
serve as a common JSONPath specification that can be used across
programming languages and environments.
This means that backwards compatibility is
not always achieved; a design principle of this document is to
go with a "consensus" between implementations even if it is rough, as
long as that does not jeopardize the objective of obtaining a usable,
stable JSON query language.</t>
        <t>The term <em>JSONPath</em> was chosen because of the XPath inspiration and also because
the outcome of a query consists of <em>paths</em> identifying nodes in the
JSON query argument.</t>
      </section>
      <section anchor="json-values">
        <name>JSON Values</name>
        <t>The JSON value a JSONPath query is applied to is, by definition, a
valid JSON value. A JSON value is often constructed by parsing
a JSON text.</t>
        <t>The parsing of a JSON text into a JSON value and what happens if a JSON
text does not represent valid JSON are not defined by this document.
Sections <xref target="RFC8259" section="4" sectionFormat="bare"/> and <xref target="RFC8259" section="8" sectionFormat="bare"/> of <xref target="RFC8259"/> identify specific situations that may
conform to the grammar for JSON texts but are not interoperable uses
of JSON, as they may cause unpredictable behavior.
This document does not attempt to define predictable
behavior for JSONPath queries in these situations.</t>
        <t>Specifically, the "Semantics" subsections of Sections
<xref format="counter" target="name-selector"/>, <xref format="counter" target="wildcard-selector"/>,
<xref format="counter" target="filter-selector"/>, and <xref format="counter" target="descendant-segment"/> describe behavior that
becomes unpredictable when the JSON value for one of the objects
under consideration was constructed out of JSON text that exhibits
multiple members for a single object that share the same member name
("duplicate names", see <xref section="4" sectionFormat="of" target="RFC8259"/>).
Also, selecting a child by name (<xref target="name-selector"/>) and comparing strings
(<xref target="comparisons"/> in <xref target="filter-selector"/>) assume these
strings are sequences of Unicode scalar values, becoming unpredictable
if they are not (<xref section="8.2" sectionFormat="of" target="RFC8259"/>).</t>
      </section>
      <section anchor="overview">
        <name>Overview of JSONPath Expressions</name>
        <t>A JSONPath expression is applied to a JSON value, known as the query argument.
The output is a nodelist.</t>
        <t>A JSONPath expression consists of an identifier followed by a series
of zero or more segments each of which contains one or more selectors.</t>
        <section anchor="ids">
          <name>Identifiers</name>
          <t>The root node identifier <tt>$</tt> refers to the root node of the query argument,
i.e., to the argument as a whole.</t>
          <t>The current node identifier <tt>@</tt> refers to the current node in the context
of the evaluation of a filter expression (<xref target="filter-selector"/>).</t>
        </section>
        <section anchor="segments">
          <name>Segments</name>
          <t>Segments select children (<tt>[&lt;selectors&gt;]</tt>) or descendants (<tt>..[&lt;selectors&gt;]</tt>) of an input value.</t>
          <t>Segments can use <em>bracket notation</em>, for example:</t>
          <sourcecode type="JSONPath"><![CDATA[
$['store']['book'][0]['title']
]]></sourcecode>
          <t>or the more compact <em>dot notation</em>, for example:</t>
          <sourcecode type="JSONPath"><![CDATA[
$.store.book[0].title
]]></sourcecode>
          <t>Bracket notation contains a comma separated list of one or more selectors of any kind.
Selectors are detailed in the next section.</t>
          <t>A JSONPath expression may use a combination of bracket and dot notations.</t>
          <t>This document treats the bracket notations as canonical and defines the shorthand dot notation in terms
of bracket notation. Examples and descriptions use shorthands where convenient.</t>
        </section>
        <section anchor="selectors">
          <name>Selectors</name>
          <t>A name selector, e.g. <tt>'name'</tt>, selects a named child of an object.</t>
          <t>An index selector, e.g. <tt>3</tt>, selects an indexed child of an array.</t>
          <t>A wildcard <tt>*</tt> (<xref target="wildcard-selector"/>) in the expression <tt>[*]</tt> selects all children of a
node and in the expression <tt>..[*]</tt> selects all descendants of a node.</t>
          <t>An array slice <tt>start:end:step</tt> (<xref target="slice"/>) selects a series of
elements from an array, giving a start position, an end position, and
an optional step value that moves the position from the start to the
end.</t>
          <t>Filter expressions <tt>?&lt;logical-expr&gt;</tt> select certain children of an object or array, as in:</t>
          <sourcecode type="JSONPath"><![CDATA[
$.store.book[?@.price < 10].title
]]></sourcecode>
        </section>
        <section anchor="summary">
          <name>Summary</name>
          <t><xref target="tbl-overview"/> provides a brief overview of JSONPath syntax.</t>
          <table anchor="tbl-overview">
            <name>Overview of JSONPath syntax</name>
            <thead>
              <tr>
                <th align="left">Syntax Element</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>$</tt></td>
                <td align="left">
                  <xref target="root-identifier">root node identifier</xref></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>@</tt></td>
                <td align="left">
                  <xref target="filter-selector">current node identifier</xref> (valid only within filter selectors)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>[&lt;selectors&gt;]</tt></td>
                <td align="left">
                  <xref target="child-segment">child segment</xref> selects zero or more children of a node; contains one or more selectors, separated by commas</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>.name</tt></td>
                <td align="left">shorthand for <tt>['name']</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>.*</tt></td>
                <td align="left">shorthand for <tt>[*]</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>..[&lt;selectors&gt;]</tt></td>
                <td align="left">
                  <xref target="descendant-segment">descendant segment</xref>: selects zero or more descendants of a node; contains one or more selectors, separated by commas</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>..name</tt></td>
                <td align="left">shorthand for <tt>..['name']</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>..*</tt></td>
                <td align="left">shorthand for <tt>..[*]</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>'name'</tt></td>
                <td align="left">
                  <xref target="name-selector">name selector</xref>: selects a named child of an object</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>*</tt></td>
                <td align="left">
                  <xref target="name-selector">wildcard selector</xref>: selects all children of a node</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>3</tt></td>
                <td align="left">
                  <xref target="index-selector">index selector</xref>: selects an indexed child of an array (from 0)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0:100:5</tt></td>
                <td align="left">
                  <xref target="slice">array slice selector</xref>: start:end:step for arrays</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>?&lt;logical-expr&gt;</tt></td>
                <td align="left">
                  <xref target="filter-selector">filter selector</xref>: selects particular children using a logical expression</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>length(@.foo)</tt></td>
                <td align="left">
                  <xref target="fnex">function extension</xref>: invokes a function in a filter expression</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="jsonpath-examples">
        <name>JSONPath Examples</name>
        <t>This section is informative. It provides examples of JSONPath expressions.</t>
        <t>The examples are based on the simple JSON value shown in
<xref target="fig-example-value"/>, representing a bookstore (that also has a bicycle).</t>
        <figure anchor="fig-example-value">
          <name>Example JSON value</name>
          <sourcecode type="json"><![CDATA[
{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 399
    }
  }
}
]]></sourcecode>
        </figure>
        <t><xref target="tbl-example"/> shows some JSONPath queries that might be applied to this example and their intended results.</t>
        <table anchor="tbl-example">
          <name>Example JSONPath expressions and their intended results when applied to the example JSON value</name>
          <thead>
            <tr>
              <th align="left">JSONPath</th>
              <th align="left">Intended result</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>$.store.book[*].author</tt></td>
              <td align="left">the authors of all books in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..author</tt></td>
              <td align="left">all authors</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$.store.*</tt></td>
              <td align="left">all things in store, which are some books and a red bicycle</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$.store..price</tt></td>
              <td align="left">the prices of everything in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[2]</tt></td>
              <td align="left">the third book</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[2].author</tt></td>
              <td align="left">the third book's author</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[2].publisher</tt></td>
              <td align="left">empty result: the third book does not have a "publisher" member</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[-1]</tt></td>
              <td align="left">the last book in order</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[0,1]</tt><br/><tt>$..book[:2]</tt></td>
              <td align="left">the first two books</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[?(@.isbn)]</tt></td>
              <td align="left">all books with an ISBN number</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[?(@.price&lt;10)]</tt></td>
              <td align="left">all books cheaper than 10</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..*</tt></td>
              <td align="left">all member values and array elements contained in the input value</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="jsonpath-syntax-and-semantics">
      <name>JSONPath Syntax and Semantics</name>
      <section anchor="synsem-overview">
        <name>Overview</name>
        <t>A JSONPath <em>expression</em> is a string which, when applied to a JSON value,
the <em>query argument</em>, selects zero or more nodes of the argument and outputs
these nodes as a nodelist.</t>
        <t>A query <bcp14>MUST</bcp14> be encoded using UTF-8.
The grammar for queries given in this document assumes that its UTF-8 form is first decoded into
Unicode code points as described
in <xref target="RFC3629"/>; implementation approaches that lead to an equivalent
result are possible.</t>
        <t>A string to be used as a JSONPath query needs to be <em>well formed</em> and
<em>valid</em>.
A string is a well-formed JSONPath query if it conforms to the ABNF syntax in this document.
A well-formed JSONPath query is valid if it also fulfills all semantic
requirements posed by this document, which are:</t>
        <ol spacing="normal" type="1"><li>Integer numbers in the JSONPath query that are relevant
to the JSONPath processing (e.g., index values and steps) <bcp14>MUST</bcp14> be
within the range of exact values defined in I-JSON <xref target="RFC7493"/>, namely
within the interval [-(2<sup>53</sup>)+1, (2<sup>53</sup>)-1].</li>
          <li>Uses of function extensions must be <em>well typed</em>,
as described in <xref target="fnex"/>.</li>
        </ol>
        <t>A JSONPath implementation <bcp14>MUST</bcp14> raise an error for any query which is not
well formed and valid.
The well-formedness and the validity of JSONPath queries are independent of
the JSON value the query is applied to. No further errors relating to the
well-formedness and the validity of a JSONPath query can be
raised during application of the query to a value.
This clearly separates well-formedness/validity errors in the query
from mismatches that may actually stem from flaws in the data.</t>
        <t>Mismatches between the structure expected by a valid query
and the structure found in the data can lead to empty query results,
which may be unexpected and indicate bugs in either.
JSONPath implementations might therefore want to provide diagnostics
to the application developer that aid in finding the cause of empty
results.</t>
        <t>Obviously, an implementation can still fail when executing a JSONPath
query, e.g., because of resource depletion, but this is not modeled in
this document.  However, the implementation <bcp14>MUST NOT</bcp14>
silently malfunction.  Specifically, if a valid JSONPath query is
evaluated against a structured value whose size does not fit in the
range of exact values, interfering with the correct interpretation of
the query, the implementation <bcp14>MUST</bcp14> provide an indication of overflow.</t>
        <t>(Readers familiar with the HTTP error model may be reminded of 400
type errors when pondering well-formedness and validity, while
resource depletion and related errors are comparable to 500 type
errors.)</t>
        <section anchor="syntax">
          <name>Syntax</name>
          <t>Syntactically, a JSONPath query consists of a root identifier (<tt>$</tt>), which
stands for a nodelist that contains the root node of the query argument,
followed by a possibly empty sequence of <em>segments</em>.</t>
          <sourcecode type="abnf"><![CDATA[
jsonpath-query      = root-identifier segments
segments            = *(S segment)
]]></sourcecode>
          <t>The syntax and semantics of segments are defined in <xref target="segments-details"/>.</t>
        </section>
        <section anchor="semantics">
          <name>Semantics</name>
          <t>In this document, the semantics of a JSONPath query define the
required results and do not prescribe the internal workings of an
implementation.  This document may describe semantics in a procedural
step-by-step fashion, but such descriptions are normative only in the sense that any implementation <bcp14>MUST</bcp14> produce an identical result, but not in the sense that implementors are required to use the same algorithms.</t>
          <t>The semantics are that a valid query is executed against a value,
the <em>query argument</em>, and produces a nodelist (i.e., a list of zero or more nodes of the value).</t>
          <t>The query is a root identifier followed by a sequence of zero or more segments, each of
which is applied to the result of the previous root identifier or segment and provides
input to the next segment.
These results and inputs take the form of nodelists.</t>
          <t>The nodelist resulting from the root identifier contains a single node,
the query argument.
The nodelist resulting from the last segment is presented as the
result of the query. Depending on the specific API, it might be
presented as an array of the JSON values at the nodes, an array of
Normalized Paths referencing the nodes, or both — or some other
representation as desired by the implementation.
Note: an empty nodelist is a valid query result.</t>
          <t>A segment operates on each of the nodes in its input nodelist in turn,
and the resultant nodelists are concatenated in the order of the input
nodelist they were derived from to produce
the result of the segment. A node may be selected more than once and
appears that number of times in the nodelist. Duplicate nodes are not removed.</t>
          <t>A syntactically valid segment <bcp14>MUST NOT</bcp14> produce errors when executing the query.
This means that some
operations that might be considered erroneous, such as using an index
lying outside the range of an array,
simply result in fewer nodes being selected.
(Additional discussion of this property can be found in the
introduction to <xref target="synsem-overview"/>.)</t>
          <t>As a consequence of this approach, if any of the segments produces an empty nodelist,
then the whole query produces an empty nodelist.</t>
          <t>If a query may produce a nodelist with more than one possible ordering, a particular implementation
may also produce distinct orderings in successive runs of the query.</t>
        </section>
        <section anchor="example">
          <name>Example</name>
          <t>Consider this example. With the query argument <tt>{"a":[{"b":0},{"b":1},{"c":2}]}</tt>, the
query <tt>$.a[*].b</tt> selects the following list of nodes: <tt>0</tt>, <tt>1</tt>
(denoted here by their value).</t>
          <t>The query consists of <tt>$</tt> followed by three segments: <tt>.a</tt>, <tt>[*]</tt>, and <tt>.b</tt>.</t>
          <t>Firstly, <tt>$</tt> produces a nodelist consisting of just the query argument.</t>
          <t>Next, <tt>.a</tt> selects from any object input node and selects the
node of any
member value of the input
node corresponding to the member name <tt>"a"</tt>.
The result is again a list of one node: <tt>[{"b":0},{"b":1},{"c":2}]</tt>.</t>
          <t>Next, <tt>[*]</tt> selects from any array input node all its elements
(for an object input node, it would select all its member
values, but not the member names).
The result is a list of three nodes: <tt>{"b":0}</tt>, <tt>{"b":1}</tt>, and <tt>{"c":2}</tt>.</t>
          <t>Finally, <tt>.b</tt> selects from any object input node with a member name
<tt>b</tt> and selects the node of the member value of the input node corresponding to that name.
The result is a list containing <tt>0</tt>, <tt>1</tt>.
This is the concatenation of three lists, two of length one containing
<tt>0</tt>, <tt>1</tt>, respectively, and one of length zero.</t>
        </section>
      </section>
      <section anchor="root-identifier">
        <name>Root Identifier</name>
        <section numbered="false" toc="exclude" anchor="syntax-1">
          <name>Syntax</name>
          <t>Every JSONPath query (except those inside filter expressions, see <xref target="filter-selector"/>) <bcp14>MUST</bcp14> begin with the root identifier <tt>$</tt>.</t>
          <sourcecode type="abnf"><![CDATA[
root-identifier     = "$"
]]></sourcecode>
        </section>
        <section numbered="false" toc="exclude" anchor="semantics-1">
          <name>Semantics</name>
          <t>The root identifier <tt>$</tt> represents the root node of the query argument
and produces a nodelist consisting of that root node.</t>
        </section>
        <section numbered="false" toc="exclude" anchor="examples">
          <name>Examples</name>
          <t>JSON:</t>
          <sourcecode type="json"><![CDATA[
{"k": "v"}
]]></sourcecode>
          <t>Queries:</t>
          <table anchor="tbl-root">
            <name>Root identifier examples</name>
            <thead>
              <tr>
                <th align="center">Query</th>
                <th align="left">Result</th>
                <th align="center">Result Path</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$</tt></td>
                <td align="left">
                  <tt>{"k": "v"}</tt></td>
                <td align="center">
                  <tt>$</tt></td>
                <td align="left">Root node</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="selectors-1">
        <name>Selectors</name>
        <t>Selectors appear only inside <xref target="child-segment">child segments</xref> and
<xref target="descendant-segment">descendant segments</xref>.</t>
        <t>A selector produces a nodelist consisting of zero or more children of the input value.</t>
        <t>There are various kinds of selectors which produce children of objects, children of arrays,
or children of either objects or arrays.</t>
        <sourcecode type="abnf"><![CDATA[
selector            = name-selector  /
                      wildcard-selector /
                      slice-selector /
                      index-selector /
                      filter-selector
]]></sourcecode>
        <t>The syntax and semantics of each kind of selector are defined below.</t>
        <section anchor="name-selector">
          <name>Name Selector</name>
          <section numbered="false" toc="exclude" anchor="syntax-name">
            <name>Syntax</name>
            <t>A name selector <tt>'&lt;name&gt;'</tt> selects at most one object member value.</t>
            <t>In contrast to JSON,
the JSONPath syntax allows strings to be enclosed in <em>single</em> or <em>double</em> quotes.</t>
            <sourcecode type="abnf"><![CDATA[
name-selector       = string-literal

string-literal      = %x22 *double-quoted %x22 /     ; "string"
                      %x27 *single-quoted %x27       ; 'string'

double-quoted       = unescaped /
                      %x27      /                    ; '
                      ESC %x22  /                    ; \"
                      ESC escapable

single-quoted       = unescaped /
                      %x22      /                    ; "
                      ESC %x27  /                    ; \'
                      ESC escapable

ESC                 = %x5C                           ; \  backslash

unescaped           = %x20-21 /                      ; see RFC 8259
                         ; omit 0x22 "
                      %x23-26 /
                         ; omit 0x27 '
                      %x28-5B /
                         ; omit 0x5C \
                      %x5D-10FFFF

escapable           = %x62 / ; b BS backspace U+0008
                      %x66 / ; f FF form feed U+000C
                      %x6E / ; n LF line feed U+000A
                      %x72 / ; r CR carriage return U+000D
                      %x74 / ; t HT horizontal tab U+0009
                      "/"  / ; / slash (solidus) U+002F
                      "\"  / ; \ backslash (reverse solidus) U+005C
                      (%x75 hexchar) ;  uXXXX      U+XXXX

hexchar             = non-surrogate /
                      (high-surrogate "\" %x75 low-surrogate)
non-surrogate       = ((DIGIT / "A"/"B"/"C" / "E"/"F") 3HEXDIG) /
                       ("D" %x30-37 2HEXDIG )
high-surrogate      = "D" ("8"/"9"/"A"/"B") 2HEXDIG
low-surrogate       = "D" ("C"/"D"/"E"/"F") 2HEXDIG

HEXDIG              = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
]]></sourcecode>
            <t>Notes:</t>
            <ul spacing="normal">
              <li>
                <tt>double-quoted</tt> strings follow the JSON string syntax (<xref section="7" sectionFormat="of" target="RFC8259"/>);
<tt>single-quoted</tt> strings follow an analogous pattern (<xref target="syntax-index"/>).
No attempt was made to improve on this syntax, so if it is desired to
escape characters with
scalar values above 0xFFFF, such as <u format="num-lit-name">🤔</u>,
they need to be represented
by a pair of surrogate escapes (<tt>"\uD83E\uDD14"</tt> in this case).</li>
              <li>Alphabetic characters in ABNF quoted strings are case-insensitive,
so each of the hexadecimal digits within <tt>\u</tt> escapes (as specified in rules
referenced by <tt>hexchar</tt>) can be either lower case or upper case,
while the <tt>u</tt> in <tt>\u</tt> needs to be lower case (indicated as <tt>%x75</tt>).</li>
            </ul>
          </section>
          <section numbered="false" toc="exclude" anchor="semantics-2">
            <name>Semantics</name>
            <t>A <tt>name-selector</tt> string <bcp14>MUST</bcp14> be converted to a
member name <tt>M</tt> by removing the surrounding quotes and
replacing each escape sequence with its equivalent Unicode character, as
shown in <xref target="tbl-esc"/>:</t>
            <table anchor="tbl-esc">
              <name>Escape Sequence Replacements</name>
              <thead>
                <tr>
                  <th align="center">Escape Sequence</th>
                  <th align="center">Unicode Character</th>
                  <th align="left">Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>\b</tt></td>
                  <td align="center">U+0008</td>
                  <td align="left">BS backspace</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\t</tt></td>
                  <td align="center">U+0009</td>
                  <td align="left">HT horizontal tab</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\n</tt></td>
                  <td align="center">U+000A</td>
                  <td align="left">LF line feed</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\f</tt></td>
                  <td align="center">U+000C</td>
                  <td align="left">FF form feed</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\r</tt></td>
                  <td align="center">U+000D</td>
                  <td align="left">CR carriage return</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\"</tt></td>
                  <td align="center">U+0022</td>
                  <td align="left">quotation mark</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\'</tt></td>
                  <td align="center">U+0027</td>
                  <td align="left">apostrophe</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\/</tt></td>
                  <td align="center">U+002F</td>
                  <td align="left">slash (solidus)</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\\</tt></td>
                  <td align="center">U+005C</td>
                  <td align="left">backslash (reverse solidus)</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\uXXXX</tt></td>
                  <td align="center">U+XXXX</td>
                  <td align="left">unicode character</td>
                </tr>
              </tbody>
            </table>
            <t>Applying the <tt>name-selector</tt> to an object node
selects a member value whose name equals the member name <tt>M</tt>,
or selects nothing if there is no such member value.
Nothing is selected from a value that is not an object.</t>
            <t>Note: processing the name selector requires comparing the member name string <tt>M</tt>
with member name strings in the JSON to which the selector is being applied.
Two strings <bcp14>MUST</bcp14> be considered equal if and only if they are identical
sequences of Unicode scalar values. In other words, normalization operations
<bcp14>MUST NOT</bcp14> be applied to either the member name string <tt>M</tt> from the JSONPath or to
the member name strings in the JSON prior to comparison.</t>
          </section>
          <section numbered="false" toc="exclude" anchor="examples-1">
            <name>Examples</name>
            <!-- EDITING NOTE: there are non-breaking spaces here between j and j -->
<!-- i.e., j j and not j j -->

<t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "o": {"j j": {"k.k": 3}},
  "'": {"@": 2}
}
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-name"/> show the name selector in use by child segments:</t>
            <table anchor="tbl-name">
              <name>Name selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$.o['j j']['k.k']</tt></td>
                  <td align="left">
                    <tt>3</tt></td>
                  <td align="center">
                    <tt>$['o']['j j']['k.k']</tt></td>
                  <td align="left">Named value in nested object</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o["j j"]["k.k"]</tt></td>
                  <td align="left">
                    <tt>3</tt></td>
                  <td align="center">
                    <tt>$['o']['j j']['k.k']</tt></td>
                  <td align="left">Named value in nested object</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$["'"]["@"]</tt></td>
                  <td align="left">
                    <tt>2</tt></td>
                  <td align="center">
                    <tt>$['\'']['@']</tt></td>
                  <td align="left">Unusual member names</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="wildcard-selector">
          <name>Wildcard Selector</name>
          <section numbered="false" toc="exclude" anchor="syntax-2">
            <name>Syntax</name>
            <t>The wildcard selector consists of an asterisk.</t>
            <sourcecode type="abnf"><![CDATA[
wildcard-selector   = "*"
]]></sourcecode>
          </section>
          <section numbered="false" toc="exclude" anchor="semantics-3">
            <name>Semantics</name>
            <t>A wildcard selector selects the nodes of all children of an object or array.
The order in which the children of an object appear in the resultant nodelist is not stipulated,
since JSON objects are unordered.
Children of an array appear in array order in the resultant nodelist.</t>
            <t>The wildcard selector selects nothing from a primitive JSON value (that is,
a number, a string, <tt>true</tt>, <tt>false</tt>, or <tt>null</tt>).</t>
          </section>
          <section numbered="false" toc="exclude" anchor="examples-2">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "o": {"j": 1, "k": 2},
  "a": [5, 3]
}
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-wild"/> show the wildcard selector in use by a child segment:</t>
            <table anchor="tbl-wild">
              <name>Wildcard selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[*]</tt></td>
                  <td align="left">
                    <tt>{"j": 1, "k": 2}</tt> <br/> <tt>[5, 3]</tt></td>
                  <td align="center">
                    <tt>$['o']</tt> <br/> <tt>$['a']</tt></td>
                  <td align="left">Object values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[*]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt></td>
                  <td align="left">Object values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[*]</tt></td>
                  <td align="left">
                    <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['k']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Alternative result</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[*, *]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Non-deterministic ordering</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[*]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>3</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt></td>
                  <td align="left">Array members</td>
                </tr>
              </tbody>
            </table>
            <t>The example above with the query <tt>$.o[*, *]</tt> shows that the wildcard selector may produce nodelists in distinct
orders each time it appears in the child segment, when it is applied to an object node with two or more
members (but not when it is applied to object nodes with fewer than two members or to array nodes).</t>
          </section>
        </section>
        <section anchor="index-selector">
          <name>Index Selector</name>
          <section anchor="syntax-index">
            <name>Syntax</name>
            <t>An index selector <tt>&lt;index&gt;</tt> matches at most one array element value.</t>
            <sourcecode type="abnf"><![CDATA[
index-selector      = int                        ; decimal integer

int                 = "0" /
                      (["-"] DIGIT1 *DIGIT)      ; - optional
DIGIT1              = %x31-39                    ; 1-9 non-zero digit
]]></sourcecode>
            <t>Applying the numerical <tt>index-selector</tt> selects the corresponding
element. JSONPath allows it to be negative (see <xref target="index-semantics"/>).</t>
            <t>To be valid, the index selector value <bcp14>MUST</bcp14> be in the I-JSON
range of exact values, see <xref target="synsem-overview"/>.</t>
            <t>Notes:</t>
            <ul spacing="normal">
              <li>An <tt>index-selector</tt> is an integer (in base 10, as in JSON numbers).</li>
              <li>As in JSON numbers, the syntax does not allow octal-like integers with leading zeros such as <tt>01</tt> or <tt>-01</tt>.</li>
            </ul>
          </section>
          <section anchor="index-semantics">
            <name>Semantics</name>
            <t>A non-negative <tt>index-selector</tt> applied to an array selects an array element using a zero-based index.
For example, the selector <tt>0</tt> selects the first and the selector <tt>4</tt> selects the fifth element of a sufficiently long array.
Nothing is selected, and it is not an error, if the index lies outside the range of the array. Nothing is selected from a value that is not an array.</t>
            <t>A negative <tt>index-selector</tt> counts from the array end.
For example, the selector <tt>-1</tt> selects the last and the selector <tt>-2</tt> selects the penultimate element of an array with at least two elements.
As with non-negative indexes, it is not an error if such an element does
not exist; this simply means that no element is selected.</t>
          </section>
          <section anchor="examples-3">
            <name>Examples</name>
            <!-- EDITING NOTE: there are non-breaking spaces here between j and j -->
<!-- i.e., j j and not j j -->

<t>JSON:</t>
            <sourcecode type="json"><![CDATA[
["a","b"]
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-index"/> show the index selector in use by a child segment.</t>
            <table anchor="tbl-index">
              <name>Index selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[1]</tt></td>
                  <td align="left">
                    <tt>"b"</tt></td>
                  <td align="center">
                    <tt>$[1]</tt></td>
                  <td align="left">Element of array</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[-2]</tt></td>
                  <td align="left">
                    <tt>"a"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt></td>
                  <td align="left">Element of array, from the end</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="slice">
          <name>Array Slice selector</name>
          <section anchor="syntax-3">
            <name>Syntax</name>
            <t>The array slice selector has the form <tt>&lt;start&gt;:&lt;end&gt;:&lt;step&gt;</tt>.
It matches elements from arrays starting at index <tt>&lt;start&gt;</tt>, ending at — but
not including — <tt>&lt;end&gt;</tt>, while incrementing by <tt>step</tt> with a default of <tt>1</tt>.</t>
            <sourcecode type="abnf"><![CDATA[
slice-selector      = [start S] ":" S [end S] [":" [S step ]]

start               = int       ; included in selection
end                 = int       ; not included in selection
step                = int       ; default: 1

B                   = %x20 /    ; Space
                      %x09 /    ; Horizontal tab
                      %x0A /    ; Line feed or New line
                      %x0D      ; Carriage return
S                   = *B        ; optional blank space

]]></sourcecode>
            <t>The slice selector consists of three optional decimal integers separated by colons.
The second colon can be omitted when the third integer is.</t>
            <t>To be valid, the integers provided <bcp14>MUST</bcp14> be in the I-JSON
range of exact values, see <xref target="synsem-overview"/>.</t>
          </section>
          <section anchor="semantics-4">
            <name>Semantics</name>
            <t>The slice selector was inspired by the slice operator of ECMAScript
4 (ES4), which was deprecated in 2014, and that of Python.</t>
            <section numbered="false" toc="exclude" anchor="informal-introduction">
              <name>Informal Introduction</name>
              <t>This section is informative.</t>
              <t>Array slicing is inspired by the behavior of the <tt>Array.prototype.slice</tt> method
of the JavaScript language as defined by the ECMA-262 standard <xref target="ECMA-262"/>,
with the addition of the <tt>step</tt> parameter, which is inspired by the Python slice expression.</t>
              <t>The array slice expression <tt>start:end:step</tt> selects elements at indices starting at <tt>start</tt>,
incrementing by <tt>step</tt>, and ending with <tt>end</tt> (which is itself excluded).
So, for example, the expression <tt>1:3</tt> (where <tt>step</tt> defaults to <tt>1</tt>)
selects elements with indices <tt>1</tt> and <tt>2</tt> (in that order) whereas
<tt>1:5:2</tt> selects elements with indices <tt>1</tt> and <tt>3</tt>.</t>
              <t>When <tt>step</tt> is negative, elements are selected in reverse order. Thus,
for example, <tt>5:1:-2</tt> selects elements with indices <tt>5</tt> and <tt>3</tt>, in
that order and <tt>::-1</tt> selects all the elements of an array in
reverse order.</t>
              <t>When <tt>step</tt> is <tt>0</tt>, no elements are selected.
(This is the one case that differs from the behavior of Python, which
raises an error in this case.)</t>
              <t>The following section specifies the behavior fully, without depending on
JavaScript or Python behavior.</t>
            </section>
            <section numbered="false" toc="exclude" anchor="normative-semantics">
              <name>Normative Semantics</name>
              <t>A slice expression selects a subset of the elements of the input array, in
the same order
as the array or the reverse order, depending on the sign of the <tt>step</tt> parameter.
It selects no nodes from a node that is not an array.</t>
              <t>A slice is defined by the two slice parameters, <tt>start</tt> and <tt>end</tt>, and
an iteration delta, <tt>step</tt>.
Each of these parameters is
optional. In the rest of this section, <tt>len</tt> denotes the length of the input array.</t>
              <t>The default value for <tt>step</tt> is <tt>1</tt>.
The default values for <tt>start</tt> and <tt>end</tt> depend on the sign of <tt>step</tt>,
as shown in <xref target="tbl-slice-start-end"/>:</t>
              <table anchor="tbl-slice-start-end">
                <name>Default array slice start and end values</name>
                <thead>
                  <tr>
                    <th align="left">Condition</th>
                    <th align="left">start</th>
                    <th align="left">end</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td align="left">step &gt;= 0</td>
                    <td align="left">0</td>
                    <td align="left">len</td>
                  </tr>
                  <tr>
                    <td align="left">step &lt; 0</td>
                    <td align="left">len - 1</td>
                    <td align="left">-len - 1</td>
                  </tr>
                </tbody>
              </table>
              <t>Slice expression parameters <tt>start</tt> and <tt>end</tt> are not directly usable
as slice bounds and must first be normalized.
Normalization for this purpose is defined as:</t>
              <sourcecode type="pseudocode"><![CDATA[
FUNCTION Normalize(i, len):
  IF i >= 0 THEN
    RETURN i
  ELSE
    RETURN len + i
  END IF
]]></sourcecode>
              <t>The result of the array index expression <tt>i</tt> applied to an array
of length <tt>len</tt> is the result of the array
slicing expression <tt>Normalize(i, len):Normalize(i, len)+1:1</tt>.</t>
              <t>Slice expression parameters <tt>start</tt> and <tt>end</tt> are used to derive slice bounds <tt>lower</tt> and <tt>upper</tt>.
The direction of the iteration, defined
by the sign of <tt>step</tt>, determines which of the parameters is the lower bound and which
is the upper bound:</t>
              <sourcecode type="pseudocode"><![CDATA[
FUNCTION Bounds(start, end, step, len):
  n_start = Normalize(start, len)
  n_end = Normalize(end, len)

  IF step >= 0 THEN
    lower = MIN(MAX(n_start, 0), len)
    upper = MIN(MAX(n_end, 0), len)
  ELSE
    upper = MIN(MAX(n_start, -1), len-1)
    lower = MIN(MAX(n_end, -1), len-1)
  END IF

  RETURN (lower, upper)
]]></sourcecode>
              <t>The slice expression selects elements with indices between the lower and
upper bounds.
In the following pseudocode, <tt>a(i)</tt> is the <tt>i+1</tt>th element of the array <tt>a</tt>
(i.e., <tt>a(0)</tt> is the first element, <tt>a(1)</tt> the second, and so forth).</t>
              <sourcecode type="pseudocode"><![CDATA[
IF step > 0 THEN

  i = lower
  WHILE i < upper:
    SELECT a(i)
    i = i + step
  END WHILE

ELSE if step < 0 THEN

  i = upper
  WHILE lower < i:
    SELECT a(i)
    i = i + step
  END WHILE

END IF
]]></sourcecode>
              <t>When <tt>step = 0</tt>, no elements are selected and the result array is empty.</t>
            </section>
          </section>
          <section anchor="examples-4">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
["a", "b", "c", "d", "e", "f", "g"]
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-slice"/> show the array slice selector in use by a child segment:</t>
            <table anchor="tbl-slice">
              <name>Array slice selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[1:3]</tt></td>
                  <td align="left">
                    <tt>"b"</tt> <br/> <tt>"c"</tt></td>
                  <td align="center">
                    <tt>$[1]</tt> <br/> <tt>$[2]</tt></td>
                  <td align="left">Slice with default step</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[5:]</tt></td>
                  <td align="left">
                    <tt>"f"</tt> <br/> <tt>"g"</tt></td>
                  <td align="center">
                    <tt>$[5]</tt> <br/> <tt>$[6]</tt></td>
                  <td align="left">Slice with no end index</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[1:5:2]</tt></td>
                  <td align="left">
                    <tt>"b"</tt> <br/> <tt>"d"</tt></td>
                  <td align="center">
                    <tt>$[1]</tt> <br/> <tt>$[3]</tt></td>
                  <td align="left">Slice with step 2</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[5:1:-2]</tt></td>
                  <td align="left">
                    <tt>"f"</tt> <br/> <tt>"d"</tt></td>
                  <td align="center">
                    <tt>$[5]</tt> <br/> <tt>$[3]</tt></td>
                  <td align="left">Slice with negative step</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[::-1]</tt></td>
                  <td align="left">
                    <tt>"g"</tt> <br/> <tt>"f"</tt> <br/> <tt>"e"</tt> <br/> <tt>"d"</tt> <br/> <tt>"c"</tt> <br/> <tt>"b"</tt> <br/> <tt>"a"</tt></td>
                  <td align="center">
                    <tt>$[6]</tt> <br/> <tt>$[5]</tt> <br/> <tt>$[4]</tt> <br/> <tt>$[3]</tt> <br/> <tt>$[2]</tt> <br/> <tt>$[1]</tt> <br/> <tt>$[0]</tt></td>
                  <td align="left">Slice in reverse order</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="filter-selector">
          <name>Filter selector</name>
          <t>Filter selectors are used to iterate over the elements or members of
structured values, i.e., JSON arrays and objects.
The structured values are identified in the nodelist offered by the
child or descendant segment using the filter selector.</t>
          <t>For each iteration (element/member), a logical expression, the <em>filter expression</em>,
is evaluated which decides whether the node of
the element/member is selected.
(While a logical expression evaluates to what mathematically is a
Boolean value, this specification uses the term <em>logical</em> to maintain a distinction from
the Boolean values that JSON can represent.)</t>
          <t>During the iteration process, the filter expression receives the node
of each array element or object member value of the structured value being
filtered; this element or member value is then known as the <em>current node</em>.</t>
          <t>The current node can be used as the start of one or more JSONPath
queries in subexpressions of the filter expression, notated
via the current-node-identifier <tt>@</tt>.
Each JSONPath query can be used either for testing existence of a
result of the query, for obtaining a specific JSON value resulting
from that query that can then be used in a comparison, or as a
<em>function argument</em>.</t>
          <t>Filter selectors may use function extensions, which are covered in <xref target="fnex"/>.
Within the logical expression for a filter selector, function
expressions can be used to operate on nodelists and values.
The set of available functions is extensible, with a number of
functions predefined, see <xref target="fnex"/>, and the ability to register further
functions provided by the Function Extensions sub-registry (<xref target="iana-fnex"/>).
When a function is defined, it is given a unique name, and its return value and each of its parameters is given a
<em>declared type</em>.
The type system is limited in scope; its purpose is to express
restrictions that, without functions, are implicit in the grammar of
filter expressions.
The type system also guides conversions (<xref target="type-conv"/>) that mimic the
way different kinds of expressions are handled in the grammar when
function expressions are not in use.</t>
          <section anchor="filter-selector-syntax">
            <name>Syntax</name>
            <t>The filter selector has the form <tt>?&lt;logical-expr&gt;</tt>.</t>
            <sourcecode type="abnf"><![CDATA[
filter-selector     = "?" S logical-expr
]]></sourcecode>
            <t>As the filter expression is composed of side-effect free constituents,
the order of evaluation does not need to be (and is not) defined.
Similarly, for conjunction (<tt>&amp;&amp;</tt>) and disjunction (<tt>||</tt>) (defined later),
both a short-circuiting and a fully evaluating
implementation will lead to the same result; both implementation
strategies are therefore valid.</t>
            <t>The current node is accessible via the current node identifier <tt>@</tt>.
This identifier addresses the current node of the filter-selector that
is directly enclosing the identifier. Note: within nested
filter-selectors, there is no syntax to address the current node of
any other than the directly enclosing filter-selector (i.e., of
filter-selectors enclosing the filter-selector that is directly
enclosing the identifier).</t>
            <t>Logical expressions offer the usual Boolean operators (<tt>||</tt> for OR,
<tt>&amp;&amp;</tt> for AND, and <tt>!</tt> for NOT).
They have the normal semantics of Boolean algebra and obey its laws
(see, for example, <xref target="BOOLEAN-LAWS"/>).
Parentheses <bcp14>MAY</bcp14> be used within <tt>logical-expr</tt> for grouping.</t>
            <sourcecode type="abnf"><![CDATA[
logical-expr        = logical-or-expr
logical-or-expr     = logical-and-expr *(S "||" S logical-and-expr)
                        ; disjunction
                        ; binds less tightly than conjunction
logical-and-expr    = basic-expr *(S "&&" S basic-expr)
                        ; conjunction
                        ; binds more tightly than disjunction

basic-expr          = paren-expr /
                      comparison-expr /
                      test-expr

paren-expr          = [logical-not-op S] "(" S logical-expr S ")"
                                        ; parenthesized expression
logical-not-op      = "!"               ; logical NOT operator
]]></sourcecode>
            <t>A test expression
either tests the existence of a node
designated by an embedded query (see <xref target="extest"/>) or tests the
result of a function expression (see <xref target="fnex"/>).
In the latter case, if the function's declared result type is
<tt>LogicalType</tt> (see <xref target="typesys"/>), it tests whether the result
is <tt>LogicalTrue</tt>; if the function's declared result type is
<tt>NodesType</tt>, it tests whether the result is non-empty.
If the function's declared result type is <tt>ValueType</tt>, its use in a
test expression is not well typed (see <xref target="well-typedness"/>).</t>
            <sourcecode type="abnf"><![CDATA[
test-expr           = [logical-not-op S]
                     (filter-query / ; existence/non-existence
                      function-expr) ; LogicalType or
                                     ; NodesType
filter-query        = rel-query / jsonpath-query
rel-query           = current-node-identifier segments
current-node-identifier = "@"
]]></sourcecode>
            <t>Comparison expressions are available for comparisons between primitive
values (that is, numbers, strings, <tt>true</tt>, <tt>false</tt>, and <tt>null</tt>).
These can be obtained via literal values; singular queries, each of
which selects at most one node the value of which is then used; or
function expressions (see <xref target="fnex"/>) of type <tt>ValueType</tt>.</t>
            <sourcecode type="abnf"><![CDATA[
comparison-expr     = comparable S comparison-op S comparable
literal             = number / string-literal /
                      true / false / null
comparable          = literal /
                      singular-query / ; singular query value
                      function-expr    ; ValueType
comparison-op       = "==" / "!=" /
                      "<=" / ">=" /
                      "<"  / ">"

singular-query      = rel-singular-query / abs-singular-query
rel-singular-query  = current-node-identifier singular-query-segments
abs-singular-query  = root-identifier singular-query-segments
singular-query-segments = *(S (name-segment / index-segment))
name-segment        = ("[" name-selector "]") /
                      ("." member-name-shorthand)
index-segment       = "[" index-selector "]"
]]></sourcecode>
            <t>Literals can be notated in the way that is usual for JSON (with the
extension that strings can use single-quote delimiters).</t>
            <t>Note: Alphabetic characters in ABNF quoted strings are case-insensitive, so within a
floating point number the ABNF expression "e" can be either the character
'e' or 'E'.</t>
            <t><tt>true</tt>, <tt>false</tt>, and <tt>null</tt> are lower-case only (case-sensitive).</t>
            <sourcecode type="abnf"><![CDATA[
number              = (int / "-0") [ frac ] [ exp ] ; decimal number
frac                = "." 1*DIGIT                  ; decimal fraction
exp                 = "e" [ "-" / "+" ] 1*DIGIT    ; decimal exponent
true                = %x74.72.75.65                ; true
false               = %x66.61.6c.73.65             ; false
null                = %x6e.75.6c.6c                ; null
]]></sourcecode>
            <t><xref target="tbl-prec"/> lists filter expression operators in order of precedence from highest (binds most tightly) to lowest (binds least tightly).</t>
            <!-- FIXME: Should the syntax column be split between unary and binary operators? -->

<table anchor="tbl-prec">
              <name>Filter expression operator precedence</name>
              <thead>
                <tr>
                  <th align="center">Precedence</th>
                  <th align="center">Operator type</th>
                  <th align="center">Syntax</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">5</td>
                  <td align="center">Grouping</td>
                  <td align="center">
                    <tt>(...)</tt></td>
                </tr>
                <tr>
                  <td align="center">4</td>
                  <td align="center">Logical NOT</td>
                  <td align="center">
                    <tt>!</tt></td>
                </tr>
                <tr>
                  <td align="center">3</td>
                  <td align="center">Relations</td>
                  <td align="center">
                    <tt>==</tt> <tt>!=</tt><br/><tt>&lt;</tt> <tt>&lt;=</tt> <tt>&gt;</tt> <tt>&gt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">2</td>
                  <td align="center">Logical AND</td>
                  <td align="center">
                    <tt>&amp;&amp;</tt></td>
                </tr>
                <tr>
                  <td align="center">1</td>
                  <td align="center">Logical OR</td>
                  <td align="center">
                    <tt>||</tt></td>
                </tr>
              </tbody>
            </table>
          </section>
          <section anchor="semantics-5">
            <name>Semantics</name>
            <t>The filter selector works with arrays and objects exclusively. Its result is a list of <em>zero</em>, <em>one</em>, <em>multiple</em> or <em>all</em> of their array elements or member values, respectively.
Applied to primitive values, it selects nothing.</t>
            <t>In the resultant nodelist, children of an array are ordered by their position in the array.
The order in which the children of an object (as opposed to an array)
appear in the resultant nodelist is not stipulated,
since JSON objects are unordered.</t>
            <section anchor="extest">
              <name>Existence Tests</name>
              <t>A query by itself in a logical context is an existence test which yields true if the query selects at least one node and yields false if the query does not select any nodes.</t>
              <t>Existence tests differ from comparisons in that:</t>
              <ul spacing="normal">
                <li>they work with arbitrary relative or absolute queries (not just singular queries).</li>
                <li>they work with queries that select structured values.</li>
              </ul>
              <t>To examine the value of a node selected by a query, an explicit comparison is necessary.
For example, to test whether the node selected by the query <tt>@.foo</tt> has the value <tt>null</tt>, use <tt>@.foo == null</tt> (see <xref target="null-semantics"/>)
rather than the negated existence test <tt>!@.foo</tt> (which yields false if <tt>@.foo</tt> selects a node, regardless of the node's value).</t>
            </section>
            <section anchor="comparisons">
              <name>Comparisons</name>
              <t>The comparison operators <tt>==</tt> and <tt>&lt;</tt> are defined first and then these are used to define <tt>!=</tt>, <tt>&lt;=</tt>, <tt>&gt;</tt>, and <tt>&gt;=</tt>.</t>
              <t>When either side of a comparison results in an empty nodelist or the
special result <tt>Nothing</tt> (see <xref target="typesys"/>):</t>
              <ul spacing="normal">
                <li>a comparison using the operator <tt>==</tt> yields true if and only the
other side also results in an empty nodelist or the special result <tt>Nothing</tt>.</li>
                <li>a comparison using the operator <tt>&lt;</tt> yields false.</li>
              </ul>
              <t>When any query or function expression on either side of a comparison results in a nodelist consisting of a single node, that side is
replaced by the value of its node and then:</t>
              <ul spacing="normal">
                <li>
                  <t>a comparison using the operator <tt>==</tt> yields true if and only if the comparison
is between:
                  </t>
                  <ul spacing="normal">
                    <li>numbers expected to interoperate as per <xref section="2.2" sectionFormat="of" target="RFC7493">I-JSON</xref> that compare equal using normal mathematical equality,</li>
                    <li>numbers at least one of which is not expected to interoperate as per I-JSON, where the numbers compare equal using an implementation specific equality,</li>
                    <li>equal primitive values which are not numbers,</li>
                    <li>equal arrays, that is arrays of the same length where each element of the first array is equal to the corresponding
element of the second array, or</li>
                    <li>
                      <t>equal objects with no duplicate names, that is where:
                      </t>
                      <ul spacing="normal">
                        <li>both objects have the same collection of names (with no duplicates), and</li>
                        <li>for each of those names, the values associated with the name by the objects are equal.</li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>a comparison using the operator <tt>&lt;</tt> yields true if and only if
the comparison is between values which are both numbers or both strings and which satisfy the comparison:  </t>
                  <ul spacing="normal">
                    <li>numbers expected to interoperate as per <xref section="2.2" sectionFormat="of" target="RFC7493">I-JSON</xref> <bcp14>MUST</bcp14> compare using the normal mathematical ordering;
numbers not expected to interoperate as per I-JSON <bcp14>MAY</bcp14> compare using an implementation specific ordering</li>
                    <li>the empty string compares less than any non-empty string</li>
                    <li>a non-empty string compares less than another non-empty string if and only if the first string starts with a
lower Unicode scalar value than the second string or if both strings start with the same Unicode scalar value and
the remainder of the first string compares less than the remainder of the second string.</li>
                  </ul>
                </li>
              </ul>
              <t><tt>!=</tt>, <tt>&lt;=</tt>, <tt>&gt;</tt>, and <tt>&gt;=</tt> are defined in terms of the other comparison operators. For any <tt>a</tt> and <tt>b</tt>:</t>
              <ul spacing="normal">
                <li>The comparison <tt>a != b</tt> yields true if and only if <tt>a == b</tt> yields false.</li>
                <li>The comparison <tt>a &lt;= b</tt> yields true if and only if <tt>a &lt; b</tt> yields true or <tt>a == b</tt> yields true.</li>
                <li>The comparison <tt>a &gt; b</tt> yields true if and only if <tt>b &lt; a</tt> yields true.</li>
                <li>The comparison <tt>a &gt;= b</tt> yields true if and only if <tt>b &lt; a</tt> yields true or <tt>a == b</tt> yields true.</li>
              </ul>
            </section>
          </section>
          <section anchor="examples-5">
            <name>Examples</name>
            <t>The first set of examples shows some comparison expressions and their
result with a given JSON value as input.</t>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "obj": {"x": "y"},
  "arr": [2, 3]
}
]]></sourcecode>
            <t>Comparisons:</t>
            <table anchor="tbl-comparison">
              <name>Comparison examples</name>
              <thead>
                <tr>
                  <th align="center">Comparison</th>
                  <th align="center">Result</th>
                  <th align="center">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$.absent1 == $.absent2</tt></td>
                  <td align="center">true</td>
                  <td align="center">Empty nodelists</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent1 &lt;= $.absent2</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent == 'g'</tt></td>
                  <td align="center">false</td>
                  <td align="center">Empty nodelist</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent1 != $.absent2</tt></td>
                  <td align="center">false</td>
                  <td align="center">Empty nodelists</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent != 'g'</tt></td>
                  <td align="center">true</td>
                  <td align="center">Empty nodelist</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &lt;= 2</tt></td>
                  <td align="center">true</td>
                  <td align="center">Numeric comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt; 2</tt></td>
                  <td align="center">false</td>
                  <td align="center">Strict, numeric comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>13 == '13'</tt></td>
                  <td align="center">false</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>'a' &lt;= 'b'</tt></td>
                  <td align="center">true</td>
                  <td align="center">String comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>'a' &gt; 'b'</tt></td>
                  <td align="center">false</td>
                  <td align="center">Strict, string comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj == $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj != $.arr</tt></td>
                  <td align="center">true</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj == $.obj</tt></td>
                  <td align="center">true</td>
                  <td align="center">Object comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj != $.obj</tt></td>
                  <td align="center">false</td>
                  <td align="center">Object comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.arr == $.arr</tt></td>
                  <td align="center">true</td>
                  <td align="center">Array comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.arr != $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Array comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj == 17</tt></td>
                  <td align="center">false</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj != 17</tt></td>
                  <td align="center">true</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj &lt;= $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Objects and arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj &lt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Objects and arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj &lt;= $.obj</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.arr &lt;= $.arr</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &lt;= $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt;= $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &lt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>true &lt;= true</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>true &gt; true</tt></td>
                  <td align="center">false</td>
                  <td align="center">Booleans are not ordered</td>
                </tr>
              </tbody>
            </table>
            <t>The second set of examples shows some complete JSONPath queries that make use
of filter selectors, and the results of evaluating these queries on a
given JSON value as input.
(Note: two of the queries employ function extensions; please see
Sections <xref format="counter" target="match"/> and <xref format="counter" target="search"/> below for details about these.)</t>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "a": [3, 5, 1, 2, 4, 6,
        {"b": "j"},
        {"b": "k"},
        {"b": {}},
        {"b": "kilo"}
       ],
  "o": {"p": 1, "q": 2, "r": 3, "s": 5, "t": {"u": 6}},
  "e": "f"
}
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-filter"/> show the filter selector in use by a child segment:</t>
            <table anchor="tbl-filter">
              <name>Filter selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$.a[?@.b == 'kilo']</tt></td>
                  <td align="left">
                    <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][9]</tt></td>
                  <td align="left">Member value comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@&gt;3.5]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>4</tt> <br/> <tt>6</tt></td>
                  <td align="center">
                    <tt>$['a'][1]</tt> <br/> <tt>$['a'][4]</tt> <br/> <tt>$['a'][5]</tt></td>
                  <td align="left">Array value comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@.b]</tt></td>
                  <td align="left">
                    <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt> <br/> <tt>{"b": {}}</tt> <br/> <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][6]</tt> <br/> <tt>$['a'][7]</tt> <br/> <tt>$['a'][8]</tt> <br/> <tt>$['a'][9]</tt></td>
                  <td align="left">Array value existence</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[?@.*]</tt></td>
                  <td align="left">
                    <tt>[3, 5, 1, 2, 4, 6, {"b": "j"}, {"b": "k"}, {"b": {}}, {"b": "kilo"}]</tt> <br/> <tt>{"p": 1, "q": 2, "r": 3, "s": 5, "t": {"u": 6}}</tt></td>
                  <td align="center">
                    <tt>$['a']</tt> <br/> <tt>$['o']</tt></td>
                  <td align="left">Existence of non-singular queries</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[?@[?@.b]]</tt></td>
                  <td align="left">
                    <tt>[3, 5, 1, 2, 4, 6, {"b": "j"}, {"b": "k"}, {"b": {}}, {"b": "kilo"}]</tt></td>
                  <td align="center">
                    <tt>$['a']</tt></td>
                  <td align="left">Nested filters</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@&lt;3, ?@&lt;3]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['p']</tt> <br/> <tt>$['o']['q']</tt> <br/> <tt>$['o']['q']</tt> <br/> <tt>$['o']['p']</tt></td>
                  <td align="left">Non-deterministic ordering</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@&lt;2 || @.b == "k"]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>{"b": "k"}</tt></td>
                  <td align="center">
                    <tt>$['a'][2]</tt> <br/> <tt>$['a'][7]</tt></td>
                  <td align="left">Array value logical OR</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?match(@.b, "[jk]")]</tt></td>
                  <td align="left">
                    <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt></td>
                  <td align="center">
                    <tt>$['a'][6]</tt> <br/> <tt>$['a'][7]</tt></td>
                  <td align="left">Array value regular expression match</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?search(@.b, "[jk]")]</tt></td>
                  <td align="left">
                    <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt> <br/> <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][6]</tt> <br/> <tt>$['a'][7]</tt> <br/> <tt>$['a'][9]</tt></td>
                  <td align="left">Array value regular expression search</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@&gt;1 &amp;&amp; @&lt;4]</tt></td>
                  <td align="left">
                    <tt>2</tt> <br/> <tt>3</tt></td>
                  <td align="center">
                    <tt>$['o']['q']</tt> <br/> <tt>$['o']['r']</tt></td>
                  <td align="left">Object value logical AND</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@&gt;1 &amp;&amp; @&lt;4]</tt></td>
                  <td align="left">
                    <tt>3</tt> <br/> <tt>2</tt></td>
                  <td align="center">
                    <tt>$['o']['r']</tt> <br/> <tt>$['o']['q']</tt></td>
                  <td align="left">Alternative result</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@.u || @.x]</tt></td>
                  <td align="left">
                    <tt>{"u": 6}</tt></td>
                  <td align="center">
                    <tt>$['o']['t']</tt></td>
                  <td align="left">Object value logical OR</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?(@.b == $.x)]</tt></td>
                  <td align="left">
                    <tt>3</tt> <br/> <tt>5</tt> <br/> <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>4</tt> <br/> <tt>6</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/><tt>$['a'][1]</tt> <br/> <tt>$['a'][2]</tt> <br/> <tt>$['a'][3]</tt> <br/> <tt>$['a'][4]</tt> <br/> <tt>$['a'][5]</tt></td>
                  <td align="left">Comparison of queries with no values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?(@ == @)]</tt></td>
                  <td align="left">
                    <tt>3</tt> <br/> <tt>5</tt> <br/> <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>4</tt> <br/> <tt>6</tt> <br/> <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt> <br/> <tt>{"b": {}}</tt> <br/> <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt> <br/><tt>$['a'][2]</tt> <br/><tt>$['a'][3]</tt> <br/><tt>$['a'][4]</tt> <br/><tt>$['a'][5]</tt> <br/><tt>$['a'][6]</tt> <br/><tt>$['a'][7]</tt> <br/><tt>$['a'][8]</tt> <br/><tt>$['a'][9]</tt></td>
                  <td align="left">Comparisons of primitive and of structured values</td>
                </tr>
              </tbody>
            </table>
            <t>The example above with the query <tt>$.o[?@&lt;3, ?@&lt;3]</tt> shows that a filter selector may produce nodelists in distinct
orders each time it appears in the child segment.</t>
          </section>
        </section>
      </section>
      <section anchor="fnex">
        <name>Function Extensions</name>
        <t>Beyond the filter expression functionality defined in the preceding
subsections, JSONPath defines an extension point that can be used to
add filter expression functionality: "Function Extensions".</t>
        <t>This section defines the extension point as well as some function
extensions that use this extension point.
While these mechanisms are designed to use the extension point,
they are an integral part of the JSONPath specification and are
expected to be implemented like any other integral part of this
specification.</t>
        <t>A function extension defines a registered name (see <xref target="iana-fnex"/>) that
can be applied to a sequence of zero or more arguments, producing a
result. Each registered function name is unique.</t>
        <t>A function extension <bcp14>MUST</bcp14> be defined such that its evaluation is
side-effect free, i.e., all possible orders of evaluation and choices
of short-circuiting or full evaluation of an expression containing it
<bcp14>MUST</bcp14> lead to the same result.
(Note: memoization or logging are not side effects in this sense
as they are visible at the implementation level only — they do not
influence the result of the evaluation.)</t>
        <sourcecode type="abnf"><![CDATA[
function-name       = function-name-first *function-name-char
function-name-first = LCALPHA
function-name-char  = function-name-first / "_" / DIGIT
LCALPHA             = %x61-7A  ; "a".."z"

function-expr       = function-name "(" S [function-argument
                         *(S "," S function-argument)] S ")"
function-argument   = literal /
                      filter-query / ; (includes singular-query)
                      logical-expr /
                      function-expr
]]></sourcecode>
        <t>Any function expressions in a query must be well formed (by conforming to the above ABNF)
and well typed,
otherwise the JSONPath implementation <bcp14>MUST</bcp14> raise an error
(see <xref target="synsem-overview"/>).
To define which function expressions are well typed,
a type system is first introduced.</t>
        <section anchor="typesys">
          <name>Type System for Function Expressions</name>
          <t>Each parameter as well as the result of a function extension must have a declared type.</t>
          <t>Declared types enable checking a JSONPath query for well-typedness
independent of any query argument the JSONPath query is applied to.</t>
          <t><xref target="tbl-types"/> defines the available types in terms of the instances they contain.</t>
          <table anchor="tbl-types">
            <name>Function extension type system</name>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Instances</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>ValueType</tt></td>
                <td align="left">JSON values or <tt>Nothing</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>LogicalType</tt></td>
                <td align="left">
                  <tt>LogicalTrue</tt> or <tt>LogicalFalse</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>NodesType</tt></td>
                <td align="left">Nodelists</td>
              </tr>
            </tbody>
          </table>
          <t>Notes:</t>
          <ul spacing="normal">
            <li>The only instances that can be directly represented in JSONPath syntax are certain JSON values
in <tt>ValueType</tt> expressed as literals (which, in JSONPath, are limited to primitive values).</li>
            <li>The special result <tt>Nothing</tt> represents the absence of a JSON value and is distinct from any JSON value, including <tt>null</tt>.</li>
            <li>
              <tt>LogicalTrue</tt> and <tt>LogicalFalse</tt> are unrelated to the JSON values expressed by the
literals <tt>true</tt> and <tt>false</tt>.</li>
          </ul>
        </section>
        <section anchor="type-conv">
          <name>Type Conversion</name>
          <t>Just as queries can be used in logical expressions by testing for the
existence of at least one node (<xref target="extest"/>), a function expression of
declared type <tt>NodesType</tt> can be used as a function argument for a
parameter of declared type <tt>LogicalType</tt>, with the equivalent conversion rule:</t>
          <ul spacing="normal">
            <li>If the nodelist contains one or more nodes, the conversion result is <tt>LogicalTrue</tt>.</li>
            <li>If the nodelist is empty, the conversion result is <tt>LogicalFalse</tt>.</li>
          </ul>
          <t>Notes:</t>
          <ul spacing="normal">
            <li>Extraction of a value from a nodelist can be performed in several
ways, so an implicit conversion from <tt>NodesType</tt> to <tt>ValueType</tt>
may be surprising and has therefore not been defined.</li>
            <li>A function expression with a declared type of <tt>NodesType</tt> can
indirectly be used as an argument for a parameter of declared type
<tt>ValueType</tt> by wrapping the expression in a call to a function extension,
such as <tt>value()</tt> (see <xref target="value"/>),
that takes a parameter of type <tt>NodesType</tt> and returns a
result of type <tt>ValueType</tt>.</li>
          </ul>
          <t>The well-typedness of function expressions can now be defined in terms of this type system.</t>
        </section>
        <section anchor="well-typedness">
          <name>Well-Typedness of Function Expressions</name>
          <t>For a function expression to be well typed:</t>
          <ol spacing="normal" type="1"><li>its declared type must be well typed in the context in which it occurs, and</li>
            <li>its arguments must be well typed for the declared type of the corresponding parameters.</li>
          </ol>
          <t>(1) As per the grammar, a function expression can occur in three different
immediate contexts, which lead to the following conditions for well-typedness:</t>
          <dl newline="true">
            <dt>As a <tt>test-expr</tt> in a logical expression:</dt>
            <dd>
              <t>The function's declared result type is <tt>LogicalType</tt>, or
(giving rise to conversion as per <xref target="type-conv"/>) <tt>NodesType</tt>.</t>
            </dd>
            <dt>As a <tt>comparable</tt> in a comparison:</dt>
            <dd>
              <t>The function's declared result type is <tt>ValueType</tt>.</t>
            </dd>
            <dt>As a <tt>function-argument</tt> in another function expression:</dt>
            <dd>
              <t>The function's declared result type fulfills the following rules for
the corresponding parameter of the enclosing function.</t>
            </dd>
          </dl>
          <t>(2) The arguments of the function expression are well typed when
each argument of the function can be used for the declared type of the
corresponding parameter, according to one of the following
conditions:</t>
          <ul spacing="normal">
            <li>When the argument is a function expression with declared result type the same as the
declared type of the parameter.</li>
            <li>
              <t>When the declared type of the parameter is <tt>LogicalType</tt> and the argument is one of the following:
              </t>
              <ul spacing="normal">
                <li>A function expression with declared result type <tt>NodesType</tt>.
In this case the argument is converted to LogicalType as per <xref target="type-conv"/>.</li>
                <li>A <tt>logical-expr</tt> that is not a function expression.</li>
              </ul>
            </li>
            <li>When the declared type of the parameter is <tt>NodesType</tt> and the argument is a query
(which includes singular query).</li>
            <li>
              <t>When the declared type of the parameter is <tt>ValueType</tt> and the argument is one of the following:
              </t>
              <ul spacing="normal">
                <li>A value expressed as a literal.</li>
                <li>
                  <t>A singular query. In this case:
                  </t>
                  <ul spacing="normal">
                    <li>If the query results in a nodelist consisting of a single node, the
argument is the value of the node.</li>
                    <li>If the query results in an empty nodelist, the argument is
the special result <tt>Nothing</tt>.</li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="length">
          <name><tt>length()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>ValueType</tt></li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>ValueType</tt> (unsigned integer or <tt>Nothing</tt>)</t>
            </dd>
          </dl>
          <t>The <tt>length()</tt> function extension provides a way to compute the length
of a value and make that available for further processing in the
filter expression:</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?length(@.authors) >= 5]
]]></sourcecode>
          <t>Its only argument is an instance of <tt>ValueType</tt> (possibly taken from a
singular query, as in the example above).  The result also is an
instance of <tt>ValueType</tt>: an unsigned integer or the special result <tt>Nothing</tt>.</t>
          <ul spacing="normal">
            <li>If the argument value is a string, the result is the number of
Unicode scalar values in the string.</li>
            <li>If the argument value is an array, the result is the number of
elements in the array.</li>
            <li>If the argument value is an object, the result is the number of
members in the object.</li>
            <li>For any other argument value, the result is the special result <tt>Nothing</tt>.</li>
          </ul>
        </section>
        <section anchor="count">
          <name><tt>count()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>NodesType</tt></li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>ValueType</tt> (unsigned integer)</t>
            </dd>
          </dl>
          <t>The <tt>count()</tt> function extension provides a way to obtain the number of
nodes in a nodelist and make that available for further processing in
the filter expression:</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?count(@.*.author) >= 5]
]]></sourcecode>
          <t>Its only argument is a nodelist.
The result is a value, an unsigned integer, that gives the number of
nodes in the nodelist.
Notes:</t>
          <ul spacing="normal">
            <li>There is no deduplication of the nodelist.</li>
            <li>The number of nodes in the nodelist is counted independent of their
values or any children they may have; e.g., the count of a non-empty
singular nodelist such as <tt>count(@)</tt> is always 1.</li>
          </ul>
        </section>
        <section anchor="match">
          <name><tt>match()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>ValueType</tt> (string)</li>
                <li>
                  <tt>ValueType</tt> (string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>)</li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>LogicalType</tt></t>
            </dd>
          </dl>
          <t>The <tt>match()</tt> function extension provides a way to check whether (the
entirety of, see <xref target="search"/> below) a given
string matches a given regular expression, which is in <xref target="I-D.draft-ietf-jsonpath-iregexp"/> form.</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?match(@.date, "1974-05-..")]
]]></sourcecode>
          <t>Its arguments are instances of <tt>ValueType</tt> (possibly taken from a
singular query, as for the first argument in the example above).
If the first argument is not a string or the second argument is not a
string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>, the result is <tt>LogicalFalse</tt>.
Otherwise, the string that is the first argument is matched against
the iregexp contained in the string that is the second argument;
the result is <tt>LogicalTrue</tt> if the string matches the iregexp and
<tt>LogicalFalse</tt> otherwise.</t>
        </section>
        <section anchor="search">
          <name><tt>search()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>ValueType</tt> (string)</li>
                <li>
                  <tt>ValueType</tt> (string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>)</li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>LogicalType</tt></t>
            </dd>
          </dl>
          <t>The <tt>search()</tt> function extension provides a way to check whether a
given string contains a substring that matches a given regular
expression, which is in <xref target="I-D.draft-ietf-jsonpath-iregexp"/> form.</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?search(@.author, "[BR]ob")]
]]></sourcecode>
          <t>Its arguments are instances of <tt>ValueType</tt> (possibly taken from a
singular query, as for the first argument in the example above).
If the first argument is not a string or the second argument is not a
string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>, the result is <tt>LogicalFalse</tt>.
Otherwise, the string that is the first argument is searched for at
least one substring that matches the iregexp contained in the string
that is the second argument; the result is <tt>LogicalTrue</tt> if such a
substring exists and <tt>LogicalFalse</tt> otherwise.</t>
        </section>
        <section anchor="value">
          <name><tt>value()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>NodesType</tt></li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>ValueType</tt></t>
            </dd>
          </dl>
          <t>The <tt>value()</tt> function extension provides a way to convert an instance of <tt>NodesType</tt> to a value and
make that available for further processing in the filter expression:</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?value(@..color) == "red"]
]]></sourcecode>
          <t>Its only argument is an instance of <tt>NodesType</tt> (possibly taken from a
<tt>filter-query</tt>, as in the example above).  The result is an
instance of <tt>ValueType</tt>.</t>
          <ul spacing="normal">
            <li>If the argument contains a single node, the result is
the value of the node.</li>
            <li>If the argument is the special result <tt>Nothing</tt> or contains multiple nodes, the
result is <tt>Nothing</tt>.</li>
          </ul>
          <t>Note: a singular query may be used anywhere where a ValueType is expected,
so there is no need to use the <tt>value()</tt> function extension with a singular query.</t>
        </section>
        <section anchor="examples-6">
          <name>Examples</name>
          <table anchor="tbl-function-expr">
            <name>Function expression examples</name>
            <thead>
              <tr>
                <th align="center">Query</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$[?length(@) &lt; 3]</tt></td>
                <td align="left">well typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?length(@.*) &lt; 3]</tt></td>
                <td align="left">not well typed since <tt>@.*</tt> is a non-singular query</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?count(@.*) == 1]</tt></td>
                <td align="left">well typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?count(1) == 1]</tt></td>
                <td align="left">not well typed since <tt>1</tt> is not a query or function expression</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?count(foo(@.*)) == 1]</tt></td>
                <td align="left">well typed, where <tt>foo()</tt> is a function extension with a parameter of type <tt>NodesType</tt> and result type <tt>NodesType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?match(@.timezone, 'Europe/.*')]</tt></td>
                <td align="left">well typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?match(@.timezone, 'Europe/.*') == true]</tt></td>
                <td align="left">not well typed as <tt>LogicalType</tt> may not be used in comparisons</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?value(@..color) == "red"]</tt></td>
                <td align="left">well typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?value(@..color)]</tt></td>
                <td align="left">not well typed as <tt>ValueType</tt> may not be used in a test expression</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?bar(@.a)]</tt></td>
                <td align="left">well typed for any function <tt>bar()</tt> with a parameter of any declared type and result type <tt>LogicalType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?bnl(@.*)]</tt></td>
                <td align="left">well typed for any function <tt>bnl()</tt> with a parameter of declared type <tt>NodesType</tt> or <tt>LogicalType</tt> and result type <tt>LogicalType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?blt(1==1)]</tt></td>
                <td align="left">well typed, where <tt>blt()</tt> is a function with a parameter of declared type <tt>LogicalType</tt> and result type <tt>LogicalType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?blt(1)]</tt></td>
                <td align="left">not well typed for the same function <tt>blt()</tt>, as <tt>1</tt> is not a query, <tt>logical-expr</tt>, or function expression</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?bal(1)]</tt></td>
                <td align="left">well typed, where <tt>bal()</tt> is a function with a parameter of declared type <tt>ValueType</tt> and result type <tt>LogicalType</tt></td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="segments-details">
        <name>Segments</name>
        <t>For each node in an input nodelist,
segments apply one or more selectors to the node and concatenate the
results of each selector into per-input-node nodelists, which are then
concatenated in the order of the input nodelist to form a single
segment result nodelist.</t>
        <t>It turns out that the more segments there are in a query, the greater the depth in the input value of the
nodes of the resultant nodelist:</t>
        <ul spacing="normal">
          <li>A query with N segments, where N &gt;= 0, produces a nodelist
consisting of nodes at depth in the input value of N or greater.</li>
          <li>A query with N segments, where N &gt;= 0, all of which are <xref target="child-segment">child segments</xref>,
produces a nodelist consisting of nodes precisely at depth N in the input value.</li>
        </ul>
        <t>There are two kinds of segment: child segments and descendant segments.</t>
        <sourcecode type="abnf"><![CDATA[
segment             = child-segment / descendant-segment
]]></sourcecode>
        <t>The syntax and semantics of each kind of segment are defined below.</t>
        <section anchor="child-segment">
          <name>Child Segment</name>
          <section numbered="false" toc="exclude" anchor="syntax-4">
            <name>Syntax</name>
            <t>The child segment consists of a non-empty, comma-separated
sequence of selectors enclosed in square brackets.</t>
            <t>Shorthand notations are also provided for when there is a single
wildcard or name selector.</t>
            <sourcecode type="abnf"><![CDATA[
child-segment       = bracketed-selection /
                      ("."
                       (wildcard-selector /
                        member-name-shorthand))

bracketed-selection = "[" S selector *(S "," S selector) S "]"

member-name-shorthand = name-first *name-char
name-first          = ALPHA /
                      "_"   /
                      %x80-10FFFF   ; any non-ASCII Unicode character
name-char           = DIGIT / name-first

DIGIT               = %x30-39              ; 0-9
ALPHA               = %x41-5A / %x61-7A    ; A-Z / a-z
]]></sourcecode>
            <t><tt>.*</tt>, a <tt>child-segment</tt> directly built from a <tt>wildcard-selector</tt>, is
shorthand for <tt>[*]</tt>.</t>
            <t><tt>.&lt;member-name&gt;</tt>, a <tt>child-segment</tt> built from a
 <tt>member-name-shorthand</tt>, is shorthand for <tt>['&lt;member-name&gt;']</tt>.
Note: this can only be used with member names that are composed of certain
characters, as specified in the ABNF rule <tt>member-name-shorthand</tt>.
Thus, for example, <tt>$.foo.bar</tt> is shorthand for <tt>$['foo']['bar']</tt> (but not for <tt>$['foo.bar']</tt>).</t>
          </section>
          <section numbered="false" toc="exclude" anchor="semantics-6">
            <name>Semantics</name>
            <t>A child segment contains a sequence of selectors, each of which
selects zero or more children of the input value.</t>
            <t>Selectors of different kinds may be combined within a single child segment.</t>
            <t>For each node in the input nodelist,
the resulting nodelist of a child segment is the concatenation of
the nodelists from each of its selectors in the order that the selectors
appear in the list.
Note: any node matched by more than one selector is kept
as many times in the nodelist.</t>
            <t>Where a selector can produce a nodelist in more than one possible order,
each occurrence of the selector in the child segment
may evaluate to produce a nodelist in a distinct order.</t>
            <t>So a child segment drills down one more level into the structure of the input value.</t>
          </section>
          <section numbered="false" toc="exclude" anchor="examples-7">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
["a", "b", "c", "d", "e", "f", "g"]
]]></sourcecode>
            <t>Queries:</t>
            <table anchor="tbl-child-segment">
              <name>Child segment examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[0, 3]</tt></td>
                  <td align="left">
                    <tt>"a"</tt> <br/> <tt>"d"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt> <br/> <tt>$[3]</tt></td>
                  <td align="left">Indices</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[0:2, 5]</tt></td>
                  <td align="left">
                    <tt>"a"</tt> <br/> <tt>"b"</tt> <br/> <tt>"f"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt> <br/> <tt>$[1]</tt> <br/> <tt>$[5]</tt></td>
                  <td align="left">Slice and index</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[0, 0]</tt></td>
                  <td align="left">
                    <tt>"a"</tt> <br/> <tt>"a"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt> <br/> <tt>$[0]</tt></td>
                  <td align="left">Duplicated entries</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="descendant-segment">
          <name>Descendant Segment</name>
          <section numbered="false" toc="exclude" anchor="syntax-5">
            <name>Syntax</name>
            <t>The descendant segment consists of a double dot <tt>..</tt>
followed by a child segment (using bracket notation).</t>
            <t>Shortand notations are also provided that correspond to the shorthand forms of the child segment.</t>
            <sourcecode type="abnf"><![CDATA[
descendant-segment  = ".." (bracketed-selection /
                            wildcard-selector /
                            member-name-shorthand)
]]></sourcecode>
            <t><tt>..*</tt>, the <tt>descendant-segment</tt> directly built from a
<tt>wildcard-selector</tt>, is shorthand for <tt>..[*]</tt>.</t>
            <t><tt>..&lt;member-name&gt;</tt>, a <tt>descendant-segment</tt> built from a
<tt>member-name-shorthand</tt>, is shorthand for <tt>..['&lt;member-name&gt;']</tt>.
Note: as with the similar shorthand of a <tt>child-segment</tt>, this can
only be used with member names that are composed of certain
characters, as specified in the ABNF rule <tt>member-name-shorthand</tt>.</t>
            <t>Note: <tt>..</tt> on its own is not a valid segment.</t>
          </section>
          <section numbered="false" toc="exclude" anchor="semantics-7">
            <name>Semantics</name>
            <t>A descendant segment produces zero or more descendants of an input value.</t>
            <t>For each node in the input nodelist,
a descendant selector visits the input node and each of
its descendants such that:</t>
            <ul spacing="normal">
              <li>nodes of any array are visited in array order, and</li>
              <li>nodes are visited before their descendants.</li>
            </ul>
            <t>The order in which the children of an object are visited is not stipulated, since
JSON objects are unordered.</t>
            <t>Suppose the descendant segment is of the form <tt>..[&lt;selectors&gt;]</tt> (after converting any shorthand
form to bracket notation)
and the nodes, in the order visited, are <tt>D1</tt>, ..., <tt>Dn</tt> (where <tt>n &gt;= 1</tt>).
Note: <tt>D1</tt> is the input value.</t>
            <t>For each <tt>i</tt> such that <tt>1 &lt;= i &lt;= n</tt>, the nodelist <tt>Ri</tt> is defined to be a result of applying
the child segment <tt>[&lt;selectors&gt;]</tt> to the node <tt>Di</tt>.</t>
            <t>For each node in the input nodelist,
the result of the descendant segment is the concatenation of <tt>R1</tt>,
..., <tt>Rn</tt> (in that order).
These results are then concatenated in input nodelist order to form
the result of the segment.</t>
            <t>So a descendant segment drills down one or more levels into the structure of each input value.</t>
          </section>
          <section numbered="false" toc="exclude" anchor="examples-8">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "o": {"j": 1, "k": 2},
  "a": [5, 3, [{"j": 4}, {"k": 6}]]
}
]]></sourcecode>
            <t>Queries:</t>
            <table anchor="tbl-descendant-segment">
              <name>Descendant segment examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$..j</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>4</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['a'][2][0]['j']</tt></td>
                  <td align="left">Object values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..j</tt></td>
                  <td align="left">
                    <tt>4</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['a'][2][0]['j']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Alternative result</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..[0]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>{"j": 4}</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][2][0]</tt></td>
                  <td align="left">Array values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..[*]</tt> <br/> <tt>$..*</tt></td>
                  <td align="left">
                    <tt>{"j": 1, "k" : 2}</tt> <br/> <tt>[5, 3, [{"j": 4}, {"k": 6}]]</tt> <br/> <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>5</tt> <br/> <tt>3</tt> <br/> <tt>[{"j": 4}, {"k": 6}]</tt> <br/> <tt>{"j": 4}</tt> <br/> <tt>{"k": 6}</tt> <br/> <tt>4</tt> <br/> <tt>6</tt></td>
                  <td align="center">
                    <tt>$['o']</tt> <br/> <tt>$['a']</tt> <br/> <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt> <br/> <tt>$['a'][2]</tt> <br/> <tt>$['a'][2][0]</tt> <br/> <tt>$['a'][2][1]</tt> <br/> <tt>$['a'][2][0]['j']</tt> <br/> <tt>$['a'][2][1]['k']</tt></td>
                  <td align="left">All values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..o</tt></td>
                  <td align="left">
                    <tt>{"j": 1, "k": 2}</tt></td>
                  <td align="center">
                    <tt>$['o']</tt></td>
                  <td align="left">Input value is visited</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o..[*, *]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Non-deterministic ordering</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a..[0, 1]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>3</tt> <br/> <tt>{"j": 4}</tt> <br/> <tt>{"k": 6}</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt> <br/> <tt>$['a'][2][0]</tt> <br/> <tt>$['a'][2][1]</tt></td>
                  <td align="left">Multiple segments</td>
                </tr>
              </tbody>
            </table>
            <t>Note: the ordering of the results for the <tt>$..[*]</tt> and <tt>$..*</tt> examples above is not guaranteed, except that:</t>
            <ul spacing="normal">
              <li>
                <tt>{"j": 1, "k": 2}</tt> must appear before <tt>1</tt> and <tt>2</tt>,</li>
              <li>
                <tt>[5, 3, [{"j": 4}, {"k": 6}]]</tt> must appear before <tt>5</tt>, <tt>3</tt>, and <tt>[{"j": 4}, {"k": 6}]</tt>,</li>
              <li>
                <tt>5</tt> must appear before <tt>3</tt> which must appear before <tt>[{"j": 4}, {"k": 6}]</tt>,</li>
              <li>
                <tt>5</tt> and <tt>3</tt> must appear before <tt>{"j": 4}</tt>, <tt>4</tt>, <tt>, {"k": 6}</tt>, and <tt>6</tt>,</li>
              <li>
                <tt>[{"j": 4}, {"k": 6}]</tt> must appear before <tt>{"j": 4}</tt> and <tt>{"k": 6}</tt>,</li>
              <li>
                <tt>{"j": 4}</tt> must appear before <tt>{"k": 6}</tt>,</li>
              <li>
                <tt>{"k": 6}</tt> must appear before <tt>4</tt>, and</li>
              <li>
                <tt>4</tt> must appear before <tt>6</tt>.</li>
            </ul>
            <t>The example above with the query <tt>$.o..[*, *]</tt> shows that a selector may produce nodelists in distinct orders
each time it appears in the descendant segment.</t>
            <t>The example above with the query <tt>$.a..[0, 1]</tt> shows that the child segment <tt>[0, 1]</tt> is applied to each node
in turn (rather than the nodes being visited once per selector, which is the case for some JSONPath implementations
that do not conform to this specification).</t>
          </section>
        </section>
      </section>
      <section anchor="null-semantics">
        <name>Semantics of <tt>null</tt></name>
        <t>Note: JSON <tt>null</tt> is treated the same as any other JSON value: it is not taken to mean "undefined" or "missing".</t>
        <section numbered="false" toc="exclude" anchor="examples-9">
          <name>Examples</name>
          <t>JSON:</t>
          <sourcecode type="json"><![CDATA[
{"a": null, "b": [null], "c": [{}], "null": 1}
]]></sourcecode>
          <t>Queries:</t>
          <table anchor="tbl-null-examples">
            <name>Examples involving (or not involving) null</name>
            <thead>
              <tr>
                <th align="center">Query</th>
                <th align="left">Result</th>
                <th align="center">Result Paths</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$.a</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['a']</tt></td>
                <td align="left">Object value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.a[0]</tt></td>
                <td align="left"> </td>
                <td align="center"> </td>
                <td align="left">
                  <tt>null</tt> used as array</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.a.d</tt></td>
                <td align="left"> </td>
                <td align="center"> </td>
                <td align="left">
                  <tt>null</tt> used as object</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[0]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Array value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[*]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Array value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[?@]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Existence</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[?@==null]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Comparison</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.c[?(@.d==null)]</tt></td>
                <td align="left"> </td>
                <td align="center"> </td>
                <td align="left">Comparison with "missing" value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.null</tt></td>
                <td align="left">
                  <tt>1</tt></td>
                <td align="center">
                  <tt>$['null']</tt></td>
                <td align="left">Not JSON null at all, just a member name string</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="normalized-paths">
        <name>Normalized Paths</name>
        <t>A Normalized Path is a unique representation of the location of a node in a value which
uniquely identifies the node in the value.
Specifically, a Normalized Path is a JSONPath query with restricted syntax (defined below),
e.g., <tt>$['book'][3]</tt>, which when applied to the value results in a nodelist consisting
of just the node identified by the Normalized Path.
Note: a Normalized Path represents the identity of a node <em>in a specific value</em>.
There is precisely one Normalized Path identifying any particular node in a value.</t>
        <t>A nodelist may be represented compactly in JSON as an array of strings, where the strings are
Normalized Paths.</t>
        <t>Normalized Paths provide a predictable format that simplifies testing and post-processing
of nodelists, e.g., to remove duplicate nodes.
Normalized Paths are used in this document as result paths in examples.</t>
        <t>Normalized Paths use the canonical bracket notation, rather than dot notation.</t>
        <t>Single quotes are used in Normalized Paths to delimit string member names. This reduces the
number of characters that need escaping when Normalized Paths appear in double quote-delimited
strings, e.g., in JSON texts.</t>
        <t>Certain characters are escaped in Normalized Paths, in one and only one way; all other
characters are unescaped.</t>
        <t>Note: Normalized Paths are singular queries, but not all singular queries are Normalized Paths.
For example, <tt>$[-3]</tt> is a singular query, but is not a Normalized Path.
The Normalized Path equivalent to <tt>$[-3]</tt> would have an index equal to the array length minus <tt>3</tt>.
(The array length must be at least <tt>3</tt> if <tt>$[-3]</tt> is to identify a node.)</t>
        <sourcecode type="abnf"><![CDATA[
normalized-path      = root-identifier *(normal-index-segment)
normal-index-segment = "[" normal-selector "]"
normal-selector      = normal-name-selector / normal-index-selector
normal-name-selector = %x27 *normal-single-quoted %x27 ; 'string'
normal-single-quoted = normal-unescaped /
                       ESC normal-escapable
normal-unescaped     =    ; omit %x0-1F control codes
                       %x20-26 /
                          ; omit 0x27 '
                       %x28-5B /
                          ; omit 0x5C \
                       %x5D-10FFFF
normal-escapable     = %x62 / ; b BS backspace U+0008
                       %x66 / ; f FF form feed U+000C
                       %x6E / ; n LF line feed U+000A
                       %x72 / ; r CR carriage return U+000D
                       %x74 / ; t HT horizontal tab U+0009
                       "'" /  ; ' apostrophe U+0027
                       "\" /  ; \ backslash (reverse solidus) U+005C
                       (%x75 normal-hexchar)
                                       ; certain values u00xx U+00XX
normal-hexchar       = "0" "0"
                       (
                          ("0" %x30-37) / ; "00"-"07"
                             ; omit U+0008-U+000A BS HT LF
                          ("0" %x62) /    ; "0b"
                             ; omit U+000C-U+000D FF CR
                          ("0" %x65-66) / ; "0e"-"0f"
                          ("1" normal-HEXDIG)
                        )
normal-HEXDIG        = DIGIT / %x61-66    ; "0"-"9", "a"-"f"
normal-index-selector = "0" / (DIGIT1 *DIGIT)
                        ; non-negative decimal integer
]]></sourcecode>
        <t>Since there can only be one Normalized Path identifying a given node, the syntax
stipulates which characters are escaped and which are not.
So the definition of <tt>normal-hexchar</tt> is designed for hex escaping of characters
which are not straightforwardly printable, for example U+000B LINE TABULATION, but
for which no standard JSON escape, such as <tt>\n</tt>, is available.</t>
        <section numbered="false" toc="exclude" anchor="examples-10">
          <name>Examples</name>
          <table anchor="tbl-normalized-path-examples">
            <name>Normalized Path examples</name>
            <thead>
              <tr>
                <th align="center">Path</th>
                <th align="center">Normalized Path</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$.a</tt></td>
                <td align="center">
                  <tt>$['a']</tt></td>
                <td align="left">Object value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[1]</tt></td>
                <td align="center">
                  <tt>$[1]</tt></td>
                <td align="left">Array index</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[-3]</tt></td>
                <td align="center">
                  <tt>$[2]</tt></td>
                <td align="left">Negative array index for an array of length 5</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.a.b[1:2]</tt></td>
                <td align="center">
                  <tt>$['a']['b'][1]</tt></td>
                <td align="left">Nested structure</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$["\u000B"]</tt></td>
                <td align="center">
                  <tt>$['\u000b']</tt></td>
                <td align="left">Unicode escape</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$["\u0061"]</tt></td>
                <td align="center">
                  <tt>$['a']</tt></td>
                <td align="left">Unicode character</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t><cref anchor="replace-xxxx">RFC Ed.: throughout this section, please replace
RFCXXXX with the RFC number of this specification and remove this
note.</cref></t>
      <section anchor="registration-of-media-type-applicationjsonpath">
        <name>Registration of Media Type application/jsonpath</name>
        <t>IANA is requested to register the following media type <xref target="RFC6838"/>:</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>jsonpath</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary (UTF-8)</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See the Security Considerations section of RFCXXXX.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>RFCXXXX</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Applications that need to convey queries in JSON data</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>Person &amp; email address to contact for further information:
   iesg@ietf.org</t>
        <dl>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>JSONPath WG</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IESG</t>
          </dd>
          <dt>Provisional registration? (standards tree only):</dt>
          <dd>
            <t>no</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-fnex">
        <name>Function Extensions</name>
        <t>This specification defines a new "Function Extensions sub-registry" in
a new "JSONPath Parameters registry", with the policy "expert review"
(<xref section="4.5" sectionFormat="of" target="BCP26"/>).</t>
        <t anchor="de-instructions">The experts are instructed to be frugal in the allocation of function
extension names that are suggestive of generally applicable semantics,
keeping them in reserve for functions that are likely to enjoy wide
use and can make good use of their conciseness.
The expert is also instructed to direct the registrant to provide a
specification (<xref section="4.6" sectionFormat="of" target="BCP26"/>), but can make exceptions,
for instance when a specification is not available at the time of
registration but is likely forthcoming.
If the expert becomes aware of function extensions that are deployed and
in use, they may also initiate a registration on their own if
they deem such a registration can avert potential future collisions.</t>
        <t>Each entry in the sub-registry must include:</t>
        <dl newline="true">
          <dt>Function Name:</dt>
          <dd>
            <t>a lower case ASCII <xref target="STD80"/> string that starts with a letter and can
contain letters, digits and underscore characters afterwards
(<tt>[a-z][_a-z0-9]*</tt>). No other entry in the sub-registry can have the
same function name.</t>
          </dd>
          <dt>Brief description:</dt>
          <dd>
            <t>a brief description</t>
          </dd>
          <dt>Parameters:</dt>
          <dd>
            <t>A comma-separated list of zero or more declared types, one for each of the
arguments expected for this function extension</t>
          </dd>
          <dt>Result:</dt>
          <dd>
            <t>The declared type of the result for this function extension</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>(see <xref section="2.3" sectionFormat="of" target="BCP26"/>)</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>a reference document that provides a description of the function
extension</t>
          </dd>
        </dl>
        <t>Initial entries in this sub-registry are as listed in <xref target="pre-reg"/>; the
entries in the Column "Change Controller" all have the value "IETF"
and the entries in the column
"Reference" all have the value "<xref target="fnex"/> of RFCXXXX":</t>
        <table anchor="pre-reg">
          <name>Initial Entries in the Function Extensions Subregistry</name>
          <thead>
            <tr>
              <th align="left">Function Name</th>
              <th align="left">Brief description</th>
              <th align="left">Parameters</th>
              <th align="left">Result</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">length</td>
              <td align="left">length of string, array, object</td>
              <td align="left">
                <tt>ValueType</tt></td>
              <td align="left">
                <tt>ValueType</tt></td>
            </tr>
            <tr>
              <td align="left">count</td>
              <td align="left">size of nodelist</td>
              <td align="left">
                <tt>NodesType</tt></td>
              <td align="left">
                <tt>ValueType</tt></td>
            </tr>
            <tr>
              <td align="left">match</td>
              <td align="left">regular expression full match</td>
              <td align="left">
                <tt>ValueType</tt>, <tt>ValueType</tt></td>
              <td align="left">
                <tt>LogicalType</tt></td>
            </tr>
            <tr>
              <td align="left">search</td>
              <td align="left">regular expression substring match</td>
              <td align="left">
                <tt>ValueType</tt>, <tt>ValueType</tt></td>
              <td align="left">
                <tt>LogicalType</tt></td>
            </tr>
            <tr>
              <td align="left">value</td>
              <td align="left">value of single node in nodelist</td>
              <td align="left">
                <tt>NodesType</tt></td>
              <td align="left">
                <tt>ValueType</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="Security">
      <name>Security Considerations</name>
      <t>Security considerations for JSONPath can stem from</t>
      <ul spacing="normal">
        <li>attack vectors on JSONPath implementations,</li>
        <li>attack vectors on how JSONPath queries are formed, and</li>
        <li>the way JSONPath is used in security-relevant mechanisms.</li>
      </ul>
      <section anchor="attack-vectors-on-jsonpath-implementations">
        <name>Attack Vectors on JSONPath Implementations</name>
        <t>Historically, JSONPath has often been implemented by feeding parts of
the query to an underlying programming language engine, e.g.,
JavaScript's <tt>eval()</tt> function.
This approach is well known to lead to injection attacks and would
require perfect input validation to prevent these attacks (see
<xref section="12" sectionFormat="of" target="RFC8259"/> for similar considerations for JSON itself).
Instead, JSONPath implementations need to implement the entire syntax
of the query without relying on the parsers of programming language
engines.</t>
        <t>Attacks on availability may attempt to trigger unusually expensive
runtime performance exhibited by certain implementations in certain
cases.
(See <xref section="10" sectionFormat="of" target="RFC8949"/> for issues in hash-table implementations,
and <xref section="8" sectionFormat="of" target="I-D.draft-ietf-jsonpath-iregexp"/> for performance issues in regular
expression implementations.)
Implementers need to be aware that good average performance is not
sufficient as long as an attacker can choose to submit specially
crafted JSONPath queries or query arguments that trigger surprisingly high, possibly
exponential, CPU usage or, for example via a naive recursive implementation of the descendant segment,
stack overflow. Implementations need to have appropriate resource management
to mitigate these attacks.</t>
      </section>
      <section anchor="attack-vectors-on-how-jsonpath-queries-are-formed">
        <name>Attack Vectors on How JSONPath Queries are Formed</name>
        <t>JSONPath queries are often not static, but formed from variables that
provide index values, member names, or values to compare with in a
filter expression.
These variables need to be translated into the form they take in a
JSONPath query, e.g., by escaping string delimiters, or by only
allowing specific constructs such as <tt>.name</tt> to be formed when the
given values allow that.
Failure to perform these translations correctly can lead to unexpected
failures, which can lead to Availability, Confidentiality, and
Integrity breaches, in particular if an adversary has control over the
values (e.g., by entering them into a Web form).
The resulting class of attacks, <em>injections</em> (e.g., SQL injections),
is consistently found among the top causes of application security
vulnerabilities and requires particular attention.</t>
      </section>
      <section anchor="attacks-on-security-mechanisms-that-employ-jsonpath">
        <name>Attacks on Security Mechanisms that Employ JSONPath</name>
        <t>Where JSONPath is used as a part of a security mechanism, attackers
can attempt to provoke unexpected or unpredictable behavior, or
take advantage of differences in behavior between JSONPath implementations.</t>
        <t>Unexpected or unpredictable behavior can arise from a query argument with certain
constructs described as unpredictable by <xref target="RFC8259"/>.
Predictable behavior can be expected, except in relation to the ordering
of objects, for any query argument conforming with <xref target="RFC7493"/>.</t>
        <t>Other attacks can target the behavior of underlying technologies such as UTF-8 (see
<xref section="10" sectionFormat="of" target="RFC3629"/>) and the Unicode character set.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="STD80">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="BCP26">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC7493">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="I-D.draft-ietf-jsonpath-iregexp">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Tim Bray" initials="T." surname="Bray">
              <organization>Textuality</organization>
            </author>
            <date day="29" month="June" year="2023"/>
            <abstract>
              <t>   This document specifies I-Regexp, a flavor of regular expressions
   that is limited in scope with the goal of interoperation across many
   different regular-expression libraries.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-iregexp-08"/>
        </reference>
        <reference anchor="UNICODE" target="https://www.unicode.org/versions/Unicode14.0.0/UnicodeStandard-14.0.pdf">
          <front>
            <title>The Unicode® Standard: Version 14.0 - Core Specification</title>
            <author>
              <organization>The Unicode Consortium</organization>
            </author>
            <date year="2021" month="September"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="JSONPath-orig" target="https://goessner.net/articles/JsonPath/">
          <front>
            <title>JSONPath — XPath for JSON</title>
            <author initials="S." surname="Gössner" fullname="Stefan Gössner">
              <organization>Fachhochschule Dortmund</organization>
            </author>
            <date year="2007" month="February" day="21"/>
          </front>
        </reference>
        <reference anchor="XPath" target="https://www.w3.org/TR/2010/REC-xpath20-20101214/">
          <front>
            <title>XML Path Language (XPath) 2.0 (Second Edition)</title>
            <author fullname="Anders Berglund" role="editor"/>
            <author fullname="Don Chamberlin" role="editor"/>
            <author fullname="Jerome Simeon" role="editor"/>
            <author fullname="Jonathan Robie" role="editor"/>
            <author fullname="Mary Fernandez" role="editor"/>
            <author fullname="Michael Kay" role="editor"/>
            <author fullname="Scott Boag" role="editor"/>
            <date day="14" month="December" year="2010"/>
          </front>
          <seriesInfo name="W3C REC" value="REC-xpath20-20101214"/>
          <seriesInfo name="W3C" value="REC-xpath20-20101214"/>
        </reference>
        <reference anchor="E4X">
          <front>
            <title>Information technology — ECMAScript for XML (E4X) specification</title>
            <author>
              <organization>ISO</organization>
            </author>
            <date year="2006"/>
          </front>
          <seriesInfo name="ISO/IEC 22537:2006" value=""/>
        </reference>
        <reference anchor="SLICE" target="https://github.com/tc39/proposal-slice-notation">
          <front>
            <title>Slice notation</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ECMA-262" target="http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf">
          <front>
            <title>ECMAScript Language Specification, Standard ECMA-262, Third Edition</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="1999" month="December"/>
          </front>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="BOOLEAN-LAWS" target="https://en.wikipedia.org/wiki/Boolean_algebra#Laws">
          <front>
            <title>Boolean algebra laws</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 2258?>

<section anchor="inspired-by-xpath">
      <name>Inspired by XPath</name>
      <t>This appendix is informative.</t>
      <t>At the time JSONPath was invented, XML was noted for the availability of
powerful tools to analyze, transform and selectively extract data from
XML documents.
<xref target="XPath"/> is one of these tools.</t>
      <t>In 2007, the need for something solving the same class of problems for
the emerging JSON community became apparent, specifically for:</t>
      <ul spacing="normal">
        <li>Finding data interactively and extracting them out of <xref target="RFC8259"/>
JSON values without special scripting.</li>
        <li>Specifying the relevant parts of the JSON data in a request by a
client, so the server can reduce the amount of data in its response,
minimizing bandwidth usage.</li>
      </ul>
      <t>(Note: XPath has evolved since 2007, and recent versions even
nominally support operating inside JSON values.
This appendix only discusses the more widely used version of XPath
that was available in 2007.)</t>
      <t>JSONPath picks up the overall feeling of XPath, but maps the concepts
to syntax (and partially semantics) that would be familiar to someone
using JSON in a dynamic language.</t>
      <t>E.g., in popular dynamic programming languages such as JavaScript,
Python and PHP, the semantics of the XPath expression</t>
      <sourcecode type="xpath"><![CDATA[
/store/book[1]/title
]]></sourcecode>
      <t>can be realized in the expression</t>
      <sourcecode type="xpath"><![CDATA[
x.store.book[0].title
]]></sourcecode>
      <t>or, in bracket notation,</t>
      <sourcecode type="xpath"><![CDATA[
x['store']['book'][0]['title']
]]></sourcecode>
      <t>with the variable x holding the query argument.</t>
      <t>The JSONPath language was designed to:</t>
      <ul spacing="normal">
        <li>be naturally based on those language characteristics;</li>
        <li>cover only the most essential parts of XPath 1.0;</li>
        <li>be lightweight in code size and memory consumption;</li>
        <li>be runtime efficient.</li>
      </ul>
      <section anchor="xpath-overview">
        <name>JSONPath and XPath</name>
        <t>JSONPath expressions apply to JSON values in the same way
as XPath expressions are used in combination with an XML document.
JSONPath uses <tt>$</tt> to refer to the root node of the query argument, similar
to XPath's <tt>/</tt> at the front.</t>
        <t>JSONPath expressions move further down the hierarchy using <em>dot notation</em>
(<tt>$.store.book[0].title</tt>)
or the <em>bracket notation</em>
(<tt>$['store']['book'][0]['title']</tt>), a lightweight/limited, and a more
heavyweight syntax replacing XPath's <tt>/</tt> within query expressions.</t>
        <t>Both JSONPath and XPath use <tt>*</tt> for a wildcard.
The descendant operators, starting with <tt>..</tt>, borrowed from <xref target="E4X"/>, are similar to XPath's <tt>//</tt>.
The array slicing construct <tt>[start:end:step]</tt> is unique to JSONPath,
inspired by <xref target="SLICE"/> from ECMASCRIPT 4.</t>
        <t>Filter expressions are supported via the syntax <tt>?&lt;logical-expr&gt;</tt> as in</t>
        <sourcecode type="JSONPath"><![CDATA[
$.store.book[?@.price < 10].title
]]></sourcecode>
        <t><xref target="tbl-xpath-overview"/> extends <xref target="tbl-overview"/> by providing a comparison
with similar XPath concepts.</t>
        <table anchor="tbl-xpath-overview">
          <name>XPath syntax compared to JSONPath</name>
          <thead>
            <tr>
              <th align="left">XPath</th>
              <th align="left">JSONPath</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>/</tt></td>
              <td align="left">
                <tt>$</tt></td>
              <td align="left">the root XML element</td>
            </tr>
            <tr>
              <td align="left">
                <tt>.</tt></td>
              <td align="left">
                <tt>@</tt></td>
              <td align="left">the current XML element</td>
            </tr>
            <tr>
              <td align="left">
                <tt>/</tt></td>
              <td align="left">
                <tt>.</tt> or <tt>[]</tt></td>
              <td align="left">child operator</td>
            </tr>
            <tr>
              <td align="left">
                <tt>..</tt></td>
              <td align="left">n/a</td>
              <td align="left">parent operator</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//</tt></td>
              <td align="left">
                <tt>..name</tt>, <tt>..[index]</tt>, <tt>..*</tt>, or <tt>..[*]</tt></td>
              <td align="left">descendants (JSONPath borrows this syntax from E4X)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>*</tt></td>
              <td align="left">
                <tt>*</tt></td>
              <td align="left">wildcard: All XML elements regardless of their names</td>
            </tr>
            <tr>
              <td align="left">
                <tt>@</tt></td>
              <td align="left">n/a</td>
              <td align="left">attribute access: JSON values do not have attributes</td>
            </tr>
            <tr>
              <td align="left">
                <tt>[]</tt></td>
              <td align="left">
                <tt>[]</tt></td>
              <td align="left">subscript operator used to iterate over XML element collections and for predicates</td>
            </tr>
            <tr>
              <td align="left">
                <tt>|</tt></td>
              <td align="left">
                <tt>[,]</tt></td>
              <td align="left">Union operator (results in a combination of node sets); called list operator in JSONPath, allows combining member names, array indices, and slices</td>
            </tr>
            <tr>
              <td align="left">n/a</td>
              <td align="left">
                <tt>[start:end:step]</tt></td>
              <td align="left">array slice operator borrowed from ES4</td>
            </tr>
            <tr>
              <td align="left">
                <tt>[]</tt></td>
              <td align="left">
                <tt>?</tt></td>
              <td align="left">applies a filter (script) expression</td>
            </tr>
            <tr>
              <td align="left">seamless</td>
              <td align="left">n/a</td>
              <td align="left">expression engine</td>
            </tr>
            <tr>
              <td align="left">
                <tt>()</tt></td>
              <td align="left">n/a</td>
              <td align="left">grouping</td>
            </tr>
          </tbody>
        </table>
        <!-- Note: the weirdness about the vertical bar above is intentional -->

<t>For further illustration, <xref target="tbl-xpath-equivalents"/> shows some XPath expressions
and their JSONPath equivalents.</t>
        <table anchor="tbl-xpath-equivalents">
          <name>Example XPath expressions and their JSONPath equivalents</name>
          <thead>
            <tr>
              <th align="left">XPath</th>
              <th align="left">JSONPath</th>
              <th align="left">Result</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>/store/book/author</tt></td>
              <td align="left">
                <tt>$.store.book[*].author</tt></td>
              <td align="left">the authors of all books in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//author</tt></td>
              <td align="left">
                <tt>$..author</tt></td>
              <td align="left">all authors</td>
            </tr>
            <tr>
              <td align="left">
                <tt>/store/*</tt></td>
              <td align="left">
                <tt>$.store.*</tt></td>
              <td align="left">all things in store, which are some books and a red bicycle</td>
            </tr>
            <tr>
              <td align="left">
                <tt>/store//price</tt></td>
              <td align="left">
                <tt>$.store..price</tt></td>
              <td align="left">the prices of everything in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[3]</tt></td>
              <td align="left">
                <tt>$..book[2]</tt></td>
              <td align="left">the third book</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[last()]</tt></td>
              <td align="left">
                <tt>$..book[-1]</tt></td>
              <td align="left">the last book in order</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[position()&lt;3]</tt></td>
              <td align="left">
                <tt>$..book[0,1]</tt><br/><tt>$..book[:2]</tt></td>
              <td align="left">the first two books</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[isbn]</tt></td>
              <td align="left">
                <tt>$..book[?@.isbn]</tt></td>
              <td align="left">filter all books with isbn number</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[price&lt;10]</tt></td>
              <td align="left">
                <tt>$..book[?@.price&lt;10]</tt></td>
              <td align="left">filter all books cheaper than 10</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//*</tt></td>
              <td align="left">
                <tt>$..*</tt></td>
              <td align="left">all elements in XML document; all member values and array elements contained in input value</td>
            </tr>
          </tbody>
        </table>
        <t>XPath has a lot more functionality (location paths in unabbreviated syntax,
operators and functions) than listed in this comparison.  Moreover, there are
significant differences in how the subscript operator works in XPath and
JSONPath:</t>
        <ul spacing="normal">
          <li>Square brackets in XPath expressions always operate on the <em>node
set</em> resulting from the previous path fragment. Indices always start
at 1.</li>
          <li>With JSONPath, square brackets operate on each of the nodes in the <em>nodelist</em>
resulting from the previous query segment. Array indices always start
at 0.</li>
        </ul>
      </section>
    </section>
    <section anchor="json-pointer">
      <name>JSON Pointer</name>
      <t>This appendix is informative.</t>
      <t>JSONPath is not intended as a replacement for, but as a more powerful
companion to, JSON Pointer <xref target="RFC6901"/>. The purposes of the two standards
are different.</t>
      <t>JSON Pointer is for identifying a single value within a JSON value whose
structure is known.</t>
      <t>JSONPath can identify a single value within a JSON value, for example by
using a Normalized Path. But JSONPath is also a query syntax that can be used
to search for and extract multiple values from JSON values whose structure
is known only in a general way.</t>
      <t>A Normalized JSONPath can be converted into a JSON Pointer by converting the syntax,
without knowledge of any JSON value. The inverse is not generally true: a numeric
reference token (path component) in a JSON Pointer may identify a member value of an object or an element of an array.
For conversion to a JSONPath query, knowledge of the structure of the JSON value is
needed to distinguish these cases.</t>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This document is based on <contact fullname="Stefan Gössner"/>'s
original online article defining JSONPath <xref target="JSONPath-orig"/>.</t>
      <t>The books example was taken from
http://coli.lili.uni-bielefeld.de/~andreas/Seminare/sommer02/books.xml
— a dead link now.</t>
      <!--  LocalWords:  JSONPath XPath nodelist memoization
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="M." surname="Mikulicic" fullname="Marko Mikulicic">
        <organization>InfluxData, Inc.</organization>
        <address>
          <postal>
            <city>Pisa</city>
            <country>IT</country>
          </postal>
          <email>mmikulicic@gmail.com</email>
        </address>
      </contact>
      <contact initials="E." surname="Surov" fullname="Edward Surov">
        <organization>TheSoul Publishing Ltd.</organization>
        <address>
          <postal>
            <city>Limassol</city>
            <country>Cyprus</country>
          </postal>
          <email>esurov.tsp@gmail.com</email>
        </address>
      </contact>
      <contact initials="G." surname="Dennis" fullname="Greg Dennis">
        <organization/>
        <address>
          <postal>
            <city>Auckland</city>
            <country>New Zealand</country>
          </postal>
          <email>gregsdennis@yahoo.com</email>
          <uri>https://github.com/gregsdennis</uri>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
Kc3kAj929hDrb0P6Nh6qT3AxG1WAkBGQYIZr79F9cNpWObkslyvZcOQze6Rc
76UKEpnZxRbt9l4l/Vn7KQG4hq8J1fBfxLLyIPB6/lxPBt3e/glW4IpxepfN
wxvBYk2FWDAAdZ49o+w5Xz1rj03pPOVvnt/6DSVY6jzvcKYzbxIyEu6r2vSi
UVF5qBq+u23/BV/27Xasd9xYsqKldctzqWLRlUwHbOm9Z3MYcirJZRW8tpju
dk46lTSLnfed9mxM3c7AlFDsczNTk31ZBSO6tYQBKtFLMILwnldMedY+JEY8
o5qjQm9Ef5bbkQ2RMa1r/AKVtWfxpyYgH3tcUOUZlxsJvWrI3kFRMpJO4ffn
/MG7TBHHIzWdZVxjikrHmV2Ls6H+vKOwE3cqOXxI0zIwqKV4CaWVpb0lgPUW
1klA0UVln9P/YG6FLkFpYVwO2FNTbcdn6PWHhNPprwIBnOgpgKHfwy8AMvzX
BZRxa0XvdbUTpI81jhSrU4/rAxsbI2Hts2eEmhOAhHb4nzowvNen6wUaA2vH
wm7I62q9YEa3wcP1wcPNwYPNOizYSDF7rLd88GDwYG3wYDx4uFFt/IR5qkLk
Nw36IKYRx/C/+qDEhpn4+X4V3X1vbjhjcoPxximotuYoHD7YKJ6QKExWZEyG
hoJW1ygoGEDDCsoyqvJIHe61BNjI+4GEsuwf/Ph6b0sfnVHG7NIFi42z2eKc
yLSYw1Fhj/5FGmF+4RSL4dKvFtZvOWzlk37r4Pyk3xgnaDo6PxkD2if1aavf
3/L+gYZ6E/2t/iyaLN4sdgeDwfKQ7i71fUoo5OkSn0g9p3cbmu6XZ1KuAN48
ezb8Yzoq5k+GXz3jwqtPzYOn9tVz+8sz6WjdH2T7cBe7QqsAvVzzX755h+/+
9r/+9r+G2o8mwVUyV5P7rSvrLWZH3zQ7mletiFjXx9Rrrd0jsuNwQem0sdh9
0ZjBfAWj5zAAGHYQ/uccbyXms3gFec5KNJutiPkpyaslUyvXQkWYwXtAIZzi
g+WyBNgrUN/HkiLaBkodtGUl6FXzKEhug1yMlNYgD1DOs4K9A+X0+C35GTAL
WzZnW6nnQras/jGJG8SPds8qtsekmV1/Lfqqq4k6ujJu4ZxjX0gP8/FiXR2O
EHUKMqldPNmrJJ5hnjdkkYmfGdyTkpkjWDEZiUmaMX8M2llLsMmqn0rsNMxn
L4CgEHM8MylffRAHc4p4LanwClC0IehRUuYRVYyZSd2oHGUyYENlbAtDdilC
Dt0aq9oABcBWOg3qwQvctZt2jidBY5yU3HK6gjgAWz8dcnSRWz9CvNx3uDmy
szuahiOsihGGU2ZmgSqX4H7/DuHDF4Nplg3t3QFDxYd/j4Qc/kI/e6ZZIhB1
Bf8IwppVHoVGW3IMIWtOQDnDr2TIbkBDlhgMRM6Tmwsu5NBdPiHbnVfKZ6lw
pTWY4J3KKQzOw5s78ZBzs5zzdBgkyQ6Cd1Nxig69KalqGjJ8EJme0r/PjdAE
HN6474vcRXG3tMoeHKY2Fe63WnUjdjdXdMFri5KhqyhxtAbjDlF60L9zxrAn
AU24sl9ttiwcT4vRnQCmW7I7QKnboBzcCaanw2D5Depc/VcKJajbzrK7o7ct
oX1YtUs2b0LXLpII0m0Vu1UTOlmEiyF9/H7UC/tzPajEWkDYMXDF1iK2FU3R
Uwjr8Jm7bti86Ibp8riuD9YRXqkOrLscmbYMwqBUU8TRJP2cgCwXDb5rC7/H
EpIVQAK27ps7OAT6digZlh5H/vBGlm6bwKpXQLWeD1XouFlVLPAcEeiKUSxH
QRspL2AVQhF8jGML3u2JlzcDzflBQ89VYRzWq5I6ltvBMIkEy+uV5hKlKBEp
Yvgz8Jkj3ngDTlzpLsyx5QAn8Lasgr3CV5Gmub1UohmB7D1zrt7Ukai+/gjF
MkeQuC6nxpuLIDepDMW5yPiVFUUGfKGUyyReZRxUdpQvs9AUv5RfNOwjFe4j
7fZRnRIILYbsTMU6q4gbj3TAU5kU06vKDhWv2L/vvqRQUrMB3NybdqXJCPRE
FsWAcffNR7d94WC37DMznsyarku4kirnNJSOzMXaWZSK3CbWfvlOmke1F80d
8GlU+7aBd/LOMzmt0fvL6C+CIPa0bsr36KQV2X/SC2d5CKiC3cosNdMWauzS
7RYW59G3zysNGEDbMPPGRgF0aLJpkz6q1WPR1dAyMkZpkzw00PtSd30YiVw0
GtLhVpGghpH+6pke3XqewTfP/G/kbG/q6+kd+npa/QQ5QWUIfN48wvPPDTCC
AaK7dPRZUOs9tYNac7c/dqTBvmnWXZ5TaFEdTQ+i4DqFpZEkN5eO4rTGzlqe
g2AkJS8HLUnvRpyi8yMWObrqeAnv8hxT3q1/JuWdJ3pLUJ0F13PQ9zzy68YZ
THA2Ql/WNcSa+YMSxBFCP+m9QA4tdKXV0+ZWJIOR6xgG7z4VQ4xth4MtnS5h
A1ZEquNUh/mqMkxzqwp02EpGaZwMf01z8GE/5ExV/urLh891MPgRudD1TGqr
eoMNmufaRjBRumk8TwrKA8IfLkVLCMTSyIf1yGdZrlP89rn5tApJ0dzmmwGQ
mixwnn8GGP74K+9jAaj1W+oYfvG+ldSBzYB85X1vAGltADAEkMsAHB/Q/PlX
DRNt+17gX3t4V6zwl59DydMGEN4YIczInc4d0RjA/B5+dwf1VWnflYC1p3Uk
t3y/1ji97VsgWkN2/qUtvrRBA8Zua0BzhInQbcxn50xvn9uPzQDiGtY0hDEd
ezQnBuTgll4iWvSN8rOnfOZQmsVlHDq9W4vYORbdXhQUU1CxNRfOU9qo7J5j
KEvAhTPLoTu6uuVM6/Klm1SGNDYubAkS5Cy7avJTf6LnqMniPGMlUnoBAvtT
2kEglyOA8GcRRzn9TUXUSAeaxGWUzKjeyKJkUDEAo+lgpYSxGz292cNkqnCM
3u/pB73gHpSKe+rOL+7UDZ5/aH5+fdPyeTLLOjf+m/f2MOfUtnNJ7PpXTOwK
/8UDHiDsFPBfALNT0lcL+PeBl6o7xs6nnd+R9pZJwA/6q15A/Kvi/QbRybcv
BiM6IhF/nJB1GGDUz7T6mN6/9oNYGtg/9Pl8Y7BZSdl63/zywO/Rj1GjB/er
D7gfPjtuG3IwCoD/pWNT9zp6Cp8AJVU/qc34QRWch9UHj6oPHtcAduZgiRUE
aCWjbX2L+NvC3woe+Yck/95N4oso3JtmmJkXX+z5zoFUjKpyLeCmwrj/e07H
gwtEQc7PzlvGSpcZjPoUBsN/vzBf8byeifivd3o0v3u+YgBrXX/6pGVzdT50
KkD6NOmobb2J2kJamnm3pHY04txdGAzW+OSXD+87y3fZC5+h8nDcPObl90zS
gcQFUPCB8cVg/O4dWN9wDcAycD75PF/Tf/yjfvH0fiWNdlhDoIEO8npqbrss
dLPdOsZGc/rvvIX8bk/VDdtuwTT20aCZd3bQd3kLsAENdYVWvxl8hGXzgd30
9lFlZzUzdZOQu5XJ1+h8o/qg5RjwxDbgS4YVGQuu2Dz9OeGMXixXsH/HCQWE
+Xc6Txpzlfu4Wq/8vVH5+37l783K3w8qfz+s/P2o8vfjCl4LdogxFwqRFNet
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
8z9bTbyEloMBAA==

-->

</rfc>
