built-in shelf
attributes (of element-expression)?
The built-in shelf attributes represents the set of all declared attributes of an element. The
name of the attribute is used as the key, and the value of the attribute is stored in the value of the shelf
item. The type of the attributes shelf is declared-attribute, while each of its items is either
of the specified-attribute or the implied-attribute type. The items whose type is specified-attribute will also be present in the specified attributes shelf.
To reference the attributes of a specific element, the element can be qualified in all of the same ways as
attribute references. The attributes shelf does not really have a name, so aliases are used
to identify items in the set of attributes. There is no default current item in a set of attributes.
The items of the attributes shelf are indexed in the order in which the attributes are declared,
instead of the order in which the attributes occur in the element's start tag. To access the attributes in the
same order they appear in the start tag, use the specified attributes shelf instead.
For example, the following output action gives the value of the first attribute declared for the current
element, no matter what its name or where its value is specified in a start tag. The following is an error if
there are no attributes declared for the currently opened element, or if the first declared attribute does not
have a specified (or defaulted) value:
output attributes[1]
Applying the has key test to the attributes shelf determines whether an element has
a declared attribute. Note, however, that just because an attribute is declared, it does not necessarily have a
value. The set of keys present in the attributes shelf is a superset of the set of keys of the
specified attributes shelf, whose all items have values.
The number of attributes declared for an element can be determined by applying number of to
attributes.
The following example shows how the of parent element qualifier can be used to refer to an
attribute of the parent element, instead of the currently opened element:
output attributes of parent {"a"}
The attributes of phrase can also be applied to an element-declaration value, in which case it
return a shelf of type attribute-declaration.
The following rule uses the attributes shelf to add id attributes to elements that can have
them:
global integer id-count element #implied output "<%q" do when attributes has key "id" do when attribute id is cdata output " id=%"%q/%d(id-count)%"" else output " id=%"%d(id-count)%"" done increment id-count done output ">%c" output "</%q>" unless content is empty