Construction of the local instantiation of a model node is a composite operation which consumes as input the source context of the parent node. The operation can be implemented as a composition of three primitive operations given by the following table.
Table 3. Primitive operations serving as building blocks of the local instantiation of a model node.
Mapping name | Mapping input | Mapping output | Only applicable if … |
---|---|---|---|
context-propagator | parent-instance.SC | Location.PSCparent-instance | - |
context-distributor | parent-instance.PSC | Location.SCAparent-instance | - |
context-atomizer | instance.SC | String (simple content) | L.has-simple-content=true |
The context-propagator maps the source context of the parent instance to a sequence of source nodes called the propagated context, which is the “raw material” required for constructing the local instantiation of the current location. This raw material is used by the context-distributor to determine the number of child instances and provide each one of them with a source context. Each of these child instances can be constructed, as its source context is given and no other input is required: (a) if the location prescribes simple content, the text value is obtained by applying the context-atomizer to the source context; (b) if the model prescribes complex content, it is obtained by passing the source context to each attribute and child location, invoking its local instantiation.
It is interesting to note that the context-propagator is a pure navigation function: it maps an input sequence of nodes to an output sequence of nodes. Also the context-atomizer and the context-distributor consume a sequence of nodes. But while the context-atomizer produces a string, the output of the context-distributor is formally defined as an array of node sequences, with one member for each instance to be constructed. Note the special case of a location with cardinality 0..1, where the array is either empty or has a single member. In the most common case, such a context-distributor triggers an instance if the propagated context is non-empty, and it uses the propagated context as the source context of that instance.
The proposed definition of primitive operations provides a bare minimum of building blocks which can be composed into a complex document transformation. They should be regarded as primary building blocks which may be further decomposed into smaller units if this reduces overall complexity. For example, the mapping of the parent context to the propagated context may be defined as a sequence of three steps: an initial mapping, subsequently refined by an optional filter step, subsequently refined by an optional sorting step. Such smaller units will be defined in the context of the metadata model, as they will correspond to distinct metadata items.