EXI 1.0 Encoding Examples

10 April 2008

Prepared By:
W3C EXI Working Group <public-exi@w3.org>

Table of Contents

1. Introduction
2. Sample XML Document
3. Fidelity Options
4. Notation
5. EXI Encoding without a schema
6. EXI Encoding with a schema


1. Introduction

This document has been prepared by the W3C EXI Working Group as an informational material to serve to help understand the basic workings of EXI encoding. A relatively simple example is used to avoid inducing confusion, nevertheless, the example has enough structure to exercise nuts and bolts of EXI encoding techniques.

The disposition of this document is temporary. It is expected the content of this document will be consumed into another document that is to be produced and named by the W3C EXI Working Group.

The content of this document is not normative. If there are any discrepancies between this document and EXI format 1.0 specification, the latter will always supercede. Certain combination of EXI Options are used for the example encodings. Those options are chosen arbitrarily for the sake of explanation simplicity and should not be taken as a suggestion that generally applies to the use of EXI in practice.

2. Sample XML Document

The following XML document is used in this document as the source that is transcoded into the equivalent EXI representation.

Example 2-1. Sample XML Document
    <?xml version="1.0" ?> 
    <!-- Sample XML Document --> 
    <ns:personnel xmlns:ns="urn:foo">
        <ns:person id="Boss">
            <ns:name>
                <ns:family>Smith</ns:family>
                <ns:given>Bill</ns:given>
            </ns:name>
            <ns:email>smith@foo.com</ns:email>
            <ns:yearsOfService>20</ns:yearsOfService>
            <ns:birthday>1955-03-24</ns:birthday>
        </ns:person>
        <!-- A second comment in this Sample XML Document -->
        <ns:person id="worker">
            <ns:name>
                <ns:family>Jones</ns:family>
                <ns:given>Bill</ns:given>
            </ns:name>
            <ns:email>jones@foo.com</ns:email>
            <ns:yearsOfService>5</ns:yearsOfService>
            <ns:birthday>1968-07-16</ns:birthday>
        </ns:person>
        <ns:person id="worker">
            <ns:name>
                <ns:family>Jones</ns:family>
                <ns:given>Sam</ns:given>
            </ns:name>
            <ns:email>sjones@foo.com</ns:email>
            <ns:yearsOfService>5</ns:yearsOfService>
            <ns:birthday>1959-01-26</ns:birthday>
        </ns:person>
    </ns:personnel>

3. Fidelity Options

The table below shows the fidelity options used in the example encodings presented in this document.

Table 3-1. Fidelity options used in this document
Fidelity optionValueEffect
Preserve.commentstrueProductions of CM events are preserved in grammars
Preserve.pisfalseProductions of PI events are pruned from grammars
Preserve.dtdfalseProductions of DOCTYPE and ER events are preserved
Preserve.prefixestrueNS events and namespace prefixes are preserved
Preserve.lexicalValuesfalseLexical form of element and attribute values is not preserved

The fidelity options setting shown above prunes those productions in EXI grammar that contain PI, DT (DocType) or ER (Entity Reference) events. This is so as to make the grammar presentation as concise as possible, yet preserving the variety of event types that are actually used in the example XML document.

In the example encodings, whitespaces that are originally present in the example XML document are omitted, which is intentional. EXI format is capable of representing those whitespaces in an efficient manner. They are omitted in the example encodings to make the encoding description more articulate by focusing on the primary data and structure without being distracted by the frequent occurrence of indentation whitespaces.

4. Notation

The table below shows the notations that are used in the description of EXI encoding in subsequent sections.

NotationDescription
N n An unsigned integer N is encoded as n-bit Unsigned Integer.
N uint An unsigned integer N is encoded as Unsigned Integer.
"Literal String"The string shown between double quotation marks is encoded as String (length prefixed sequence of characters).
"Literal String"+nThe string shown between double quotation marks is encoded as String (length prefixed sequence of characters) with the length part being the length of the string incremented by n.

5. EXI Encoding without a schema

This section describes the encoding of EXI stream body when the sample XML document is transcoded into an EXI document in the absence of any schemas.

EventGrammarEXI EncodingNote
EventCodeContent
<?xml version="1.0" ?>
SD
Document
SDDocContent0
00  
<!-- Sample XML Document -->
CM
DocContent
SE(*)DocEnd0
CMDocContent1.0.0
11" Sample XML Document " 
<ns:personnel>
SE
DocContent
SE(*)DocEnd0
CMDocContent1.0.0
01 02 "urn:foo" "personnel"+1 00
  1. 02 "urn:foo" (uri miss)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "personnel"+1 (local-name miss)
  4. Local-Names (urn:foo)
    0"personnel"

  5. 00 (undefined prefix)
  6. Note: If there are no prefixes specified for the URI of the QName by preceding NS events in the EXI stream, the prefix is undefined. An undefined prefix is represented using zero bits (i.e., omitted).

  7. StartTagPersonnel is pushed on rule-stack
xmlns:ns = "urn:foo"
NS
StartTagPersonnel
EE0.0
AT(*)StartTagPersonnel0.1
NSStartTagPersonnel0.2
SE(*)ElementPersonnel0.3
CHElementPersonnel0.4
CMElementPersonnel0.5.0
00 2343  00 "ns" 11
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. 00 "ns" (prefix miss)
  4. Prefixes (urn:foo)
    0"ns"

    Note: Prefixes as part of a Namespace Declaration (NS Event) are encoded according to the prefix partition optimized for frequent use of compact identifiers.

  5. 11 (local-element-ns flag)
<ns:person>
SE
StartTagPersonnel
EE0.0
AT(*)StartTagPersonnel0.1
NSStartTagPersonnel0.2
SE(*)ElementPersonnel0.3
CHElementPersonnel0.4
CMElementPersonnel0.5.0
00 3343 "person"+1 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "person"+1 (local-name miss)

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

    Note: QName prefixes are represented as n-bit unsigned integers, where n is log2(N) and N is the number of unique prefixes specified for the URI of the QName by preceding NS events in the EXI stream.

  7. StartTagPersonnel extended by SE({urn:foo}person)

  8. StartTagPersonnel
    SE({urn:foo}person)ElementPersonnel0
    EE1.0
    AT(*)StartTagPersonnel1.1
    NSStartTagPersonnel1.2
    SE(*)ElementPersonnel1.3
    CHElementPersonnel1.4
    CMElementPersonnel1.5.0
  9. Current rule moves on to ElementPersonnel and StartTagPerson is pushed on rule-stack
id = "Boss"
AT
StartTagPerson
EE0.0
AT(*)StartTagPerson0.1
NSStartTagPerson0.2
SE(*)ElementPerson0.3
CHElementPerson0.4
CMElementPerson0.5.0
00 1313 "id"+1 00 "Boss"+2
  1. (0+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "id"+1 (local-name miss)

  4. Local-Names (default)
    0"id"

  5. 00 (prefix hit)
  6. Prefixes ("" [empty string])
    0"" [empty string]

  7. "Boss"+2 (value miss)

  8. Values (id)
    0"Boss"

  9. StartTagPerson extended by AT(id)

  10. StartTagPerson
    AT(id)StartTagPerson0
    EE1.0
    AT(*)StartTagPerson1.1
    NSStartTagPerson1.2
    SE(*)ElementPerson1.3
    CHElementPerson1.4
    CMElementPerson1.5.0
<ns:name>
SE
StartTagPerson
AT(id)StartTagPerson0
EE1.0
AT(*)StartTagPerson1.1
NSStartTagPerson1.2
SE(*)ElementPerson1.3
CHElementPerson1.4
CMElementPerson1.5.0
11 3343 "name"+1 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "name"+1 (local-name miss)

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"
    2"name"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

  7. StartTagPerson extended by SE({urn:foo}name)

  8. StartTagPerson
    SE({urn:foo}name)ElementPerson0
    AT(id)StartTagPerson1
    EE2.0
    AT(*)StartTagPerson2.1
    NSStartTagPerson2.2
    SE(*)ElementPerson2.3
    CHElementPerson2.4
    CMElementPerson2.5.0
  9. Current rule moves on to ElementPerson and StartTagName is pushed on rule-stack
<ns:family>
SE
StartTagName
EE0.0
AT(*)StartTagName0.1
NSStartTagName0.2
SE(*)ElementName0.3
CHElementName0.4
CMElementName0.5.0
00 3343 "family"+1 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "family"+1 (local-name miss)

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"
    2"name"
    3"family"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

  7. StartTagName extended by SE({urn:foo}family)

  8. StartTagName
    SE({urn:foo}family)ElementName0
    EE1.0
    AT(*)StartTagName1.1
    NSStartTagName1.2
    SE(*)ElementName1.3
    CHElementName1.4
    CMElementName1.5.0
  9. Current rule moves on to ElementName and StartTagFamily is pushed on rule-stack
Smith
CH
StartTagFamily
EE0.0
AT(*)StartTagFamily0.1
NSStartTagFamily0.2
SE(*)ElementFamily0.3
CHElementFamily0.4
CMElementFamily0.5.0
00 43"Smith"+2
  1. "Smith"+2 (value miss)

  2. Values ({urn:foo}family)
    0"Smith"

  3. Extend the grammar as follows.
  4. StartTagFamily
    CHElementFamily0
    EE1.0
    AT(*)StartTagFamily1.1
    NSStartTagFamily1.2
    SE(*)ElementFamily1.3
    CHElementFamily1.4
    CMElementFamily1.5.0

  5. Current rule moves on to ElementFamily
</ns:family>
EE
ElementFamily
EE0
SE(*)ElementFamily1.0
CHElementFamily1.1
CMElementFamily1.2.0
01 
  1. Current rule popped from rule-stack
<ns:given>
SE
ElementName
EE0
SE(*)ElementName1.0
CHElementName1.1
CMElementName1.2.0
11 0243 "given"+1 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "given"+1 (local-name miss)

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"
    2"name"
    3"family"
    4"given"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

  7. ElementName extended by SE({urn:foo}given)

  8. ElementName
    SE({urn:foo}given)ElementName0
    EE1
    SE(*)ElementName2.0
    CHElementName2.1
    CMElementName2.2.0
  9. StartTagGiven is pushed on rule-stack
Bill
CH
StartTagGiven
EE0.0
AT(*)StartTagGiven0.1
NSStartTagGiven0.2
SE(*)ElementGiven0.3
CHElementGiven0.4
CMElementGiven0.5.0
00 43"Bill"+2
  1. "Bill"+2 (value miss)

  2. Values ({urn:foo}given)
    0"Bill"

  3. Extend the grammar as follows.
  4. StartTagGiven
    CHElementGiven0
    EE1.0
    AT(*)StartTagGiven1.1
    NSStartTagGiven1.2
    SE(*)ElementGiven1.3
    CHElementGiven1.4
    CMElementGiven1.5.0

  5. Current rule moves on to ElementGiven
</ns:given>
EE
ElementGiven
EE0
SE(*)ElementGiven1.0
CHElementGiven1.1
CMElementGiven1.2.0
01 
  1. Current rule popped from rule-stack
</ns:name>
EE
ElementName
SE({urn:foo}given)ElementName0
EE1
SE(*)ElementName2.0
CHElementName2.1
CMElementName2.2.0
12 
  1. Current rule popped from rule-stack
<ns:email>
SE
ElementPerson
EE0
SE(*)ElementPerson1.0
CHElementPerson1.1
CMElementPerson1.2.0
11 0243 "email"+1 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "email"+1 (local-name miss)

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"
    2"name"
    3"family"
    4"given"
    5"email"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

  7. ElementPerson extended by SE({urn:foo}email)

  8. ElementPerson
    SE({urn:foo}email)ElementPerson0
    EE1
    SE(*)ElementPerson2.0
    CHElementPerson2.1
    CMElementPerson2.2.0
  9. StartTagEmail is pushed on rule-stack
smith@foo.com
CH
StartTagEmail
EE0.0
AT(*)StartTagEmail0.1
NSStartTagEmail0.2
SE(*)ElementEmail0.3
CHElementEmail0.4
CMElementEmail0.5.0
00 43"smith@foo.com"+2
  1. "smith@foo.com"+2 (value miss)

  2. Values ({urn:foo}email)
    0"smith@foo.com"

  3. Extend the grammar as follows.
  4. StartTagEmail
    CHElementEmail0
    EE1.0
    AT(*)StartTagEmail1.1
    NSStartTagEmail1.2
    SE(*)ElementEmail1.3
    CHElementEmail1.4
    CMElementEmail1.5.0

  5. Current rule moves on to ElementEmail
</ns:email>
EE
ElementEmail
EE0
SE(*)ElementEmail1.0
CHElementEmail1.1
CMElementEmail1.2.0
01 
  1. Current rule popped from rule-stack
<ns:yearsOfService>
SE
ElementPerson
SE({urn:foo}email)ElementPerson0
EE1
SE(*)ElementPerson2.0
CHElementPerson2.1
CMElementPerson2.2.0
22 0243 "yearsOfService"+1 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "yearsOfService"+1

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"
    2"name"
    3"family"
    4"given"
    5"email"
    6"yearsOfService"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

  7. ElementPerson extended by SE({urn:foo}yearsOfService)

  8. ElementPerson
    SE({urn:foo}yearsOfService)ElementPerson0
    SE({urn:foo}email)ElementPerson1
    EE2
    SE(*)ElementPerson3.0
    CHElementPerson3.1
    CMElementPerson3.2.0
  9. StartTagYearsOfService is pushed on rule-stack
20
CH
StartTagYearsOfService
EE0.0
AT(*)StartTagYearsOfService0.1
NSStartTagYearsOfService0.2
SE(*)ElementYearsOfService0.3
CHElementYearsOfService0.4
CMElementYearsOfService0.5.0
00 43"20"+2
  1. "20"+2 (value miss)

  2. Values ({urn:foo}yearsOfService)
    0"20"

  3. Extend the grammar as follows.
  4. StartTagYearsOfService
    CHElementYearsOfService0
    EE1.0
    AT(*)StartTagYearsOfService1.1
    NSStartTagYearsOfService1.2
    SE(*)ElementYearsOfService1.3
    CHElementYearsOfService1.4
    CMElementYearsOfService1.5.0

  5. Current rule moves on to ElementYearsOfService
</ns:yearsOfService>
EE
ElementYearsOfService
EE0
SE(*)ElementYearsOfService1.0
CHElementYearsOfService1.1
CMElementYearsOfService1.2.0
01 
  1. Current rule popped from rule-stack
<ns:birthday>
SE
ElementPerson
SE({urn:foo}yearsOfService)ElementPerson0
SE({urn:foo}email)ElementPerson1
EE2
SE(*)ElementPerson3.0
CHElementPerson3.1
CMElementPerson3.2.0
32 0243 "birthday"+1 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. "birthday"+1 (local-name miss)

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"
    2"name"
    3"family"
    4"given"
    5"email"
    6"yearsOfService"
    7"birthday"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

  7. ElementPerson extended by SE({urn:foo}birthday)

  8. ElementPerson
    SE({urn:foo}birthday)ElementPerson0
    SE({urn:foo}yearsOfService)ElementPerson1
    SE({urn:foo}email)ElementPerson2
    EE3
    SE(*)ElementPerson4.0
    CHElementPerson4.1
    CMElementPerson4.2.0
  9. StartTagBirthday is pushed on rule-stack
1955-03-24
CH
StartTagBirthday
EE0.0
AT(*)StartTagBirthday0.1
NSStartTagBirthday0.2
SE(*)ElementBirthday0.3
CHElementBirthday0.4
CMElementBirthday0.5.0
00 43"1955-03-24"+2
  1. "1955-03-24"+2 (value miss)

  2. Values ({urn:foo}birthday)
    0"1955-03-24"

  3. Extend the grammar as follows.
  4. StartTagBirthday
    CHElementBirthday0
    EE1.0
    AT(*)StartTagBirthday1.1
    NSStartTagBirthday1.2
    SE(*)ElementBirthday1.3
    CHElementBirthday1.4
    CMElementBirthday1.5.0

  5. Current rule moves on to ElementBirthday
</ns:birthday>
EE
ElementBirthday
EE0
SE(*)ElementBirthday1.0
CHElementBirthday1.1
CMElementBirthday1.2.0
01 
  1. Current rule popped from rule-stack
</ns:person>
EE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
33 
  1. Current rule popped from rule-stack
<!-- A second comment in this Sample XML Document -->
CM
ElementPersonnel
EE0
SE(*)ElementPersonnel1.0
CHElementPersonnel1.1
CMElementPersonnel1.2.0
11 22" A second comment in this Sample XML Document " 
<ns:person>
SE
ElementPersonnel
EE0
SE(*)ElementPersonnel1.0
CHElementPersonnel1.1
CMElementPersonnel1.2.0
11 0243 01B 13 00
  1. (3+1)3 (uri hit)

  2. URIs
    0"" [empty string]
    1".../XML/1998/namespace"
    2".../XMLSchema-instance"
    3"urn:foo"

  3. 0uint 13 (local-name hit)

  4. Local-Names (urn:foo)
    0"personnel"
    1"person"
    2"name"
    3"family"
    4"given"
    5"email"
    6"yearsOfService"
    7"birthday"

  5. 00 (prefix hit)
  6. Prefixes (urn:foo)
    0"ns"

  7. ElementPersonnel extended by SE({urn:foo}person)

  8. ElementPersonnel
    SE({urn:foo}person)ElementPersonnel0
    EE1
    SE(*)ElementPersonnel2.0
    CHElementPersonnel2.1
    CMElementPersonnel2.2.0
  9. StartTagPerson is pushed on rule-stack
id = "worker"
AT
StartTagPerson
SE({urn:foo}name)ElementPerson0
AT(id)StartTagPerson1
EE2.0
AT(*)StartTagPerson2.1
NSStartTagPerson2.2
SE(*)ElementPerson2.3
CHElementPerson2.4
CMElementPerson2.5.0
1200 "worker"+2
  1. 00 (prefix hit)
  2. Prefixes ("" [empty string])
    0"" [empty string]

  3. "worker"+2 (value miss)

  4. Values (id)
    0"Boss"
    1"worker"

<ns:name>
SE
StartTagPerson
SE({urn:foo}name)ElementPerson0
AT(id)StartTagPerson1
EE2.0
AT(*)StartTagPerson2.1
NSStartTagPerson2.2
SE(*)ElementPerson2.3
CHElementPerson2.4
CMElementPerson2.5.0
0200
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. Current rule moves on to ElementPerson and StartTagName is pushed on rule-stack
<ns:family>
SE
StartTagName
SE({urn:foo}family)ElementName0
EE1.0
AT(*)StartTagName1.1
NSStartTagName1.2
SE(*)ElementName1.3
CHElementName1.4
CMElementName1.5.0
0100
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. Current rule moves on to ElementPerson and StartTagFamily is pushed on rule-stack
Jones
CH
StartTagFamily
CHElementFamily0
EE1.0
AT(*)StartTagFamily1.1
NSStartTagFamily1.2
SE(*)ElementFamily1.3
CHElementFamily1.4
CMElementFamily1.5.0
01"Jones"+2
  1. "Jones"+2 (value miss)

  2. Values ({urn:foo}family)
    0"Smith"
    0"Jones"

  3. Current rule moves on to ElementFamily
</ns:family>
EE
ElementFamily
EE0
SE(*)ElementFamily1.0
CHElementFamily1.1
CMElementFamily1.2.0
01 
  1. Current rule popped from rule-stack
<ns:given>
SE
ElementName
SE({urn:foo}given)ElementName0
EE1
SE(*)ElementName2.0
CHElementName2.1
CMElementName2.2.0
0200
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagGiven is pushed on rule-stack
Bill
CH
StartTagGiven
CHElementGiven0
EE1.0
AT(*)StartTagGiven1.1
NSStartTagGiven1.2
SE(*)ElementGiven1.3
CHElementGiven1.4
CMElementGiven1.5.0
010uint
  1. 0uint 00 (value hit)

  2. Values ({urn:foo}given)
    0"Bill"

  3. Current rule moves on to ElementGiven
</ns:given>
EE
ElementGiven
EE0
SE(*)ElementGiven1.0
CHElementGiven1.1
CMElementGiven1.2.0
01 
  1. Current rule popped from rule-stack
</ns:name>
EE
ElementName
SE({urn:foo}given)ElementName0
EE1
SE(*)ElementName2.0
CHElementName2.1
CMElementName2.2.0
12 
  1. Current rule popped from rule-stack
<ns:email>
SE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
2300
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagEmail is pushed on rule-stack
jones@foo.com
CH
StartTagEmail
CHElementEmail0
EE1.0
AT(*)StartTagEmail1.1
NSStartTagEmail1.2
SE(*)ElementEmail1.3
CHElementEmail1.4
CMElementEmail1.5.0
01"jones@foo.com"+2
  1. "jones@foo.com"+2 (value miss)

  2. Values ({urn:foo}email)
    0"smith@foo.com"
    1"jones@foo.com"

  3. Current rule moves on to ElementEmail
</ns:email>
EE
ElementEmail
EE0
SE(*)ElementEmail1.0
CHElementEmail1.1
CMElementEmail1.2.0
01 
  1. Current rule popped from rule-stack
<ns:yearsOfService>
SE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
1300
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagYearsOfService is pushed on rule-stack
5
CH
StartTagYearsOfService
CHElementYearsOfService0
EE1.0
AT(*)StartTagYearsOfService1.1
NSStartTagYearsOfService1.2
SE(*)ElementYearsOfService1.3
CHElementYearsOfService1.4
CMElementYearsOfService1.5.0
01"5"+2
  1. "5"+2 (value miss)

  2. Values ({urn:foo}yearsOfService)
    0"20"
    1"5"

  3. Current rule moves on to ElementYearsOfService
</ns:yearsOfService>
EE
ElementYearsOfService
EE0
SE(*)ElementYearsOfService1.0
CHElementYearsOfService1.1
CMElementYearsOfService1.2.0
01 
  1. Current rule popped from rule-stack
<ns:birthday>
SE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
0300
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagBirthday is pushed on rule-stack
1968-07-16
CH
StartTagBirthday
CHElementBirthday0
EE1.0
AT(*)StartTagBirthday1.1
NSStartTagBirthday1.2
SE(*)ElementBirthday1.3
CHElementBirthday1.4
CMElementBirthday1.5.0
01"1968-07-16"+2
  1. "1968-07-16"+2 (value miss)

  2. Values ({urn:foo}birthday)
    0"1955-03-24"
    1"1968-07-16"

  3. Current rule moves on to ElementBirthday
</ns:birthday>
EE
ElementBirthday
EE0
SE(*)ElementBirthday1.0
CHElementBirthday1.1
CMElementBirthday1.2.0
01 
  1. Current rule popped from rule-stack
</ns:person>
EE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
33 
  1. Current rule popped from rule-stack
<ns:person>
SE
ElementPersonnel
SE({urn:foo}person)ElementPersonnel0
EE1
SE(*)ElementPersonnel2.0
CHElementPersonnel2.1
CMElementPersonnel2.2.0
0200
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagPerson is pushed on rule-stack
id = "worker"
AT
StartTagPerson
SE({urn:foo}name)ElementPerson0
AT(id)StartTagPerson1
EE2.0
AT(*)StartTagPerson2.1
NSStartTagPerson2.2
SE(*)ElementPerson2.3
CHElementPerson2.4
CMElementPerson2.5.0
1200 0uinit 11
  1. 00 (prefix hit)
  2. Prefixes ("" [empty string])
    0"" [empty string]

  3. 0uinit 11 (value hit)

  4. Values (id)
    0"Boss"
    1"worker"

<ns:name>
SE
StartTagPerson
SE({urn:foo}name)ElementPerson0
AT(id)StartTagPerson1
EE2.0
AT(*)StartTagPerson2.1
NSStartTagPerson2.2
SE(*)ElementPerson2.3
CHElementPerson2.4
CMElementPerson2.5.0
0200
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. Current rule moves on to ElementPerson and StartTagName is pushed on rule-stack
<ns:family>
SE
StartTagName
SE({urn:foo}family)ElementName0
EE1.0
AT(*)StartTagName1.1
NSStartTagName1.2
SE(*)ElementName1.3
CHElementName1.4
CMElementName1.5.0
0100
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. Current rule moves on to ElementName and StartTagFamily is pushed on rule-stack
Jones
CH
StartTagFamily
CHElementFamily0
EE1.0
AT(*)StartTagFamily1.1
NSStartTagFamily1.2
SE(*)ElementFamily1.3
CHElementFamily1.4
CMElementFamily1.5.0
010uint 11
  1. 0uint 11 (value hit)

  2. Values ({urn:foo}family)
    0"Smith"
    1"Jones"

  3. Current rule moves on to ElementFamily
</ns:family>
EE
ElementFamily
EE0
SE(*)ElementFamily1.0
CHElementFamily1.1
CMElementFamily1.2.0
01 
  1. Current rule popped from rule-stack
<ns:given>
SE
ElementName
SE({urn:foo}given)ElementName0
EE1
SE(*)ElementName2.0
CHElementName2.1
CMElementName2.2.0
0200
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagGiven is pushed on rule-stack
Sam
CH
StartTagGiven
CHElementGiven0
EE1.0
AT(*)StartTagGiven1.1
NSStartTagGiven1.2
SE(*)ElementGiven1.3
CHElementGiven1.4
CMElementGiven1.5.0
01"Sam"+2
  1. "Sam"+2 (value miss)

  2. Values ({urn:foo}given)
    0"Bill"
    1"Sam"

  3. Current rule moves on to ElementGiven
</ns:given>
EE
ElementGiven
EE0
SE(*)ElementGiven1.0
CHElementGiven1.1
CMElementGiven1.2.0
01 
  1. Current rule popped from rule-stack
</ns:name>
EE
ElementName
SE({urn:foo}given)ElementName0
EE1
SE(*)ElementName2.0
CHElementName2.1
CMElementName2.2.0
12 
  1. Current rule popped from rule-stack
<ns:email>
SE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
2300
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagEmail is pushed on rule-stack
sjones@foo.com
CH
StartTagEmail
CHElementEmail0
EE1.0
AT(*)StartTagEmail1.1
NSStartTagEmail1.2
SE(*)ElementEmail1.3
CHElementEmail1.4
CMElementEmail1.5.0
01"sjones@foo.com"+2
  1. "sjones@foo.com"+2 (value miss)

  2. Values ({urn:foo}email)
    0"smith@foo.com"
    1"jones@foo.com"
    2"sjones@foo.com"

  3. Current rule moves on to ElementEmail
</ns:email>
EE
ElementEmail
EE0
SE(*)ElementEmail1.0
CHElementEmail1.1
CMElementEmail1.2.0
01 
  1. Current rule popped from rule-stack
<ns:yearsOfService>
SE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
1300
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagYearsOfService is pushed on rule-stack
5
CH
StartTagYearsOfService
CHElementYearsOfService0
EE1.0
AT(*)StartTagYearsOfService1.1
NSStartTagYearsOfService1.2
SE(*)ElementYearsOfService1.3
CHElementYearsOfService1.4
CMElementYearsOfService1.5.0
010uint 11
  1. 0uint 11 (value hit)

  2. Values ({urn:foo}yearsOfService)
    0"20"
    1"5"

  3. Current rule moves on to ElementYearsOfService
</ns:yearsOfService>
EE
ElementYearsOfService
EE0
SE(*)ElementYearsOfService1.0
CHElementYearsOfService1.1
CMElementYearsOfService1.2.0
01 
  1. Current rule popped from rule-stack
<ns:birthday>
SE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
0300
  1. 00 (prefix hit)
  2. Prefixes (urn:foo)
    0"ns"

  3. StartTagBirthday is pushed on rule-stack
1959-01-26
CH
StartTagBirthday
CHElementBirthday0
EE1.0
AT(*)StartTagBirthday1.1
NSStartTagBirthday1.2
SE(*)ElementBirthday1.3
CHElementBirthday1.4
CMElementBirthday1.5.0
01"1959-01-26"+2
  1. "1959-01-26"+2 (value miss)

  2. Values ({urn:foo}birthday)
    0"1955-03-24"
    1"1968-07-16"
    2"1959-01-26"

  3. Current rule moves on to ElementBirthday
</ns:birthday>
EE
ElementBirthday
EE0
SE(*)ElementBirthday1.0
CHElementBirthday1.1
CMElementBirthday1.2.0
01 
  1. Current rule popped from rule-stack
</ns:person>
EE
ElementPerson
SE({urn:foo}birthday)ElementPerson0
SE({urn:foo}yearsOfService)ElementPerson1
SE({urn:foo}email)ElementPerson2
EE3
SE(*)ElementPerson4.0
CHElementPerson4.1
CMElementPerson4.2.0
33 
  1. Current rule popped from rule-stack
</ns:personnel>
EE
ElementPersonnel
SE({urn:foo}person)ElementPersonnel0
EE1
SE(*)ElementPersonnel2.0
CHElementPersonnel2.1
CMElementPersonnel2.2.0
12 
  1. Current rule popped from rule-stack
EOF
ED
DocEnd
ED0
CMDocEnd1.0.0
01  

6. EXI Encoding with a schema

Note:

TBD