[This local archive copy mirrored from the canonical site: http://CandL.let.ruu.nl/staff/arjan/phd/tei/xps/xpsdtd.htm; links may not have complete integrity, so use the canonical document at this URL if possible.]

     DTD for extended pointer syntax tree (XPS-tree).
     Please tell me if this
     rings a bell.

     The root of any XPS tree is an <xps>. In the DTD the <bridge> is
     defined such that several example xps trees can be shown and parsed
     in single document instance.

     The DTD defines element for nodes in the XPS-tree. An element has
     element content or data content; elements are never mixed with data.
     If data content, the data is the value of the value property
     (expressed through CONREF attributes).
     Other attributes declare additional properties.

     Implied attributes are NULL (empty string, i.e. no value specified).

     Lexical types are defined on all attribute values through primitives and
     literals. Lextype primitives:

     character : any character
                 Regular= (.)
     nonspace  : any character except space
                 Regular= (^\s)
     digit     : any of '1234567890'
                 Regular= (\d)
     name      : any name in accordance with SGML declaration
                 Regular= ([a-zA-z0-9_.]+)
     regexp    : regular expression
                 Regular= ((.)*)
     number    : ('+' | '-')?, digit+
                 Regular= ([+-]?[01234567890]+)
     numtoken  : digit+, name
                 Regular= ([0123456789]+[a-zA-z0-9_.]+)
     sqlit     : ("'", character*, "'")
                 Regular= ("(.)*")
     dqlit     : ('"', character*, '"')
                 Regular= ('(.)*')
     literal   : sqlit | dqlit
                 Regular= ('(.)*')|("(.)*")
     (implied) : Implied by governing notation
     (none)    : No lexical type specifications implied

     Trees for patterns created out of regular expressions are decribed
     in a pattern-DTD (for pattern-trees) (not supplied in this web mirror).
-->
<!--
     Preamble:
     Bridge element, and character data entities.
-->
<!ELEMENT bridge    O O (xps*)>
<!ENTITY % characters SYSTEM "G:\ENT\PUBENT.ALL">
%characters;

<!--
    Predefined navigation: Identity and root element: HERE ROOT
    Examples: (here)
-->
<!ENTITY % predef   "root | here">
<!ELEMENT (%predef) - O EMPTY>

<!--
    nodes that directly perform a global search: ID REF
    Examples: (here)
-->
<!ELEMENT id        - O (#PCDATA)>
<!ATTLIST id        value CDATA #CONREF
                    -- Reference by elements ID value
                       Lextype: name -->
<!ELEMENT ref       - O (#PCDATA)>
<!ATTLIST ref       value CDATA #CONREF
                    -- Canonical reference
                       Lextype: nonspace+ -->
<!--
    Navigators are nodes that navigate into context: CHILD DESCENDANT
    ANCESTOR PREVIOUS FOLLOWING NEXT.
    These require a number of steps, each next step to be relative to the
    previous location or navigation result.
    Examples: (here)
-->
<!ELEMENT navigator - O (step)+
                    -- i.e. navigators step though immediate context
                       though 1..n steps -->
<!ATTLIST navigator dir CDATA #REQUIRED
                    -- lextype: 'CHILD' | 'DESCENDANT' | 'ANCESTOR' |
                                'PREVIOUS' | 'FOLLOWING' | 'NEXT'
                    -->
<!--
    nodes that acces textual content of a component: PATTERN, TOKEN, STR
    Examples: (here)
-->
<!ELEMENT pattern   - O (#PCDATA)>
<!ATTLIST pattern   value CDATA #CONREF
                    -- Match by regular expression
                       Lextype: regexp+
                    --
                    pattern CDATA #IMPLIED
                    -- describes .pattern property, i.e. <pattern> created
                       by parsing (Self value).
                       Lextype: (none)
                    -->

<!ENTITY % textaddr "token | str"
                    -- Match by absolute position
                    -->
<!ELEMENT (%textaddr) - O (number,number?)
                    --  i.e. 1 or 2 numbers, specifying (offset : length) -->

<!--
    Location expressions in foreign notations: FOREIGN HYQ
    Examples: (here)
-->
<!ENTITY % other    "foreign | hyq"
                    -- i.e. other pointer language expressions:
                       FOREIGN parms, HYQ parms
                    -->
<!ELEMENT foreign   - O (parm*)>
<!ELEMENT parm      - O (#PCDATA)
                    -- lextype: (implied)
                       Each parm within a <foreign> hold the (bracketed)
                       parameter text for the unspecified foreign notation
                    -->

<!ELEMENT hyq       - O (#PCDATA)>
<!ATTLIST hyq       value CDATA #CONREF
                    -- lextype: (implied)
                    -->

<!--
    nodes that imply a location action ('location terms')
-->
<!ENTITY % locterm " %predef | id | ref | navigator | pattern |
                     %textaddr | space | %other | ditto "
                     -- i.e. location terms -->

<!--
     An expression in the extended pointer syntax is parsed into a
     xps tree rooted in an <xps>, and consisting of location terms.
     This is called the 'ladder' in TEI XPS.
-->
<!ELEMENT xps      - O (%locterm)+ >
<!ATTLIST xps      result CDATA #IMPLIED
                   -- informal description of xps result
                      Lextype: (none)
                   -->

<!--
    A list of numbers
-->
<!ELEMENT numbers  - O (number)+>
<!ELEMENT number   - O (#PCDATA)>
<!ATTLIST number    value CDATA #CONREF
                   -- lextype: number
                   -->
<!--
    Node for addressing a section of an object in a foreign notation: SPACE
    Examples: (here)
-->
<!ENTITY % pointpair "(numbers, numbers?)">
<!ELEMENT space     - O (%pointpair)
                    -- i.e. the locations of each dimension along a
                       Cathesian coordinate space as named in attribute
                    -->
<!ATTLIST space     name CDATA #REQUIRED
                    -- lextype: character*
                       i.e. name of dimension used in external data entity
                    -->
<!--
    Node for addressing the recorded result of previous XPS query: DITTO
    Examples: (here)
-->
<!ELEMENT ditto     - O EMPTY
                    -- the current xps node. within xps element type,
                       valid only in TO attribute -->

<!--
     Single step within navigation: criterium for selecting node.
-->
<!ELEMENT step      - O (avspec*) >
<!ATTLIST step      instance CDATA #REQUIRED
                    -- lextype: number | 'ALL'--
                    element CDATA #IMPLIED
                    -- lextype: name | '#CDATA' | '*' | regexp -->

<!--
    Attribute name and attribute value to be matched on current node
    See <step>.
-->
<!ELEMENT avspec    - O (#PCDATA)>
<!ATTLIST avspec    name CDATA #REQUIRED
                    -- lextype: name | '*' | regexp
                    --
                    value CDATA #CONREF
                    -- lextype: literal | name | number | numtoken |
                                '#IMPLIED' | '*' | regexp
                    -->