Entity attributes

In SGML, attributes may be of type entity or entities. Retrieving the data associated with an entity that is the value of an attribute is similar to retrieving the value of a regular entity, except that you must do so in an element rule instead of an external text or data entity rule.

This has the following consequences:

  • You need to determine whether the attribute is an entity (or entities) attribute using the is entity (or is entities) test.
  • You need to determine whether the entity is external or internal using the is external (or is internal) test, and act accordingly.
  • You use the format items "%pv" and "%ev" instead of "%pq" and "%eq" to access the PUBLIC and SYSTEM identifiers. For an internal entity, you can use the format item "%ev" to access the replacement value of the attribute.
  • The entity is in-library test is not available, so you must use the test #library has key "%pv(attribute-name)" instead.

  declare catch entity-replacement-found
  element "foo"
     repeat over attributes as this-attribute
        do when attribute this-attribute is entity
           do when attribute this-attribute is external
              do when #library has key "%pv(baz)"
                 do when file #library{"%pv(baz)"} exists
                    output file #library{"%pv(baz)"}
                 else
                    repeat over #libpath
                       do when file (#libpath || #library{"%pv(baz)"}) exists
                          output file (#libpath || #library{"%pv(baz)"})
                          throw entity-replacement-found
                       done
                    again
                 done
              else
                 do when file "%ev(baz)" exists
                    output file "%ev(baz)"
                    throw entity-replacement-found
                 done
              done
              output ""
              catch entity-replacement-found
           else ;it is an internal entity
              output "%ev(this-attribute)" ; output its replacement text
           done
        done
     again
     output "%c"