Application-Defined Extension Elements

A markup specification using Markup Compatibility elements and attributes might define one or more specific extension elements in the namespaces it defines. Extension elements suspend Markup Compatibility processing within their content. Except as noted below, within the content of an extension element, markup consumers shall not treat elements and attributes from non-understood namespaces as Markup Compatibility errors. Similarly, under the same conditions, markup consumers shall disregard elements and attributes from the Markup Compatibility namespace.

A specification for an element nested somewhere within an extension-element might require a markup consumer to re-establish Markup Compatibility processing. Within the scope of such a nested element and its content, a markup consumer shall disregard all Markup Compatibility attributes that were encountered on elements outside of the element that re-establishes Markup Compatibility processing. Within the scope of such a nested element, a markup consumer might understand a set of namespaces that is different from the set of namespaces understood at the point in the markup where the extension element was encountered.

The following examples illustrate two uses of application-defined extension elements:


An extension element can be used to introduce an “island” of unprocessed XML whose markup is otherwise unconstrained by the application's specification. The specification of the island element can further require preservation of the contents of the island by markup processors, without requiring the use of the @PreserveElements and @PreserveAttributes Markup Compatibility attributes. ]


Some markup specifications and markup consumers can use an extension element to implement an add-in model. In an add-in model, the specification for the contents of the extension element is separate from the specification for the extension element itself.

The specification for some particular nested content can include support for Markup Compatibility elements and attributes, while the specification for other nested content could omit such support. If the specification for the nested content does include support for Markup Compatibility elements and attributes, the Markup Compatibility processing state is reset temporarily for processing of the nested content. Any @Ignorable attribute-value associated with an extension element or any of its ancestor elements is “forgotten” during the processing of content nested within that extension element. In an add-in model the set of namespaces assumed to be understood when processing descendant elements of an extension element is completely unrelated to the set of understood namespaces when that extension element itself is processed.

In this example, the "Circles" specification includes an extension <AddIn> element, allowing for nested markup to be handled by a markup consumer that does not process Circle markup. The specification for the nested "TextFlow" markup does not provide for the processing of Markup Compatibility elements and attributes.

  mc:Ignorable="v2 "> 
  <Circle Center="0,0" Radius="20" Color="Blue" 
    v2:Opacity="0.5" />
  <Circle Center="25,0" Radius="20" Color="Black" 
    v2:Opacity="0.5" />
  <Circle Center="50,0" Radius="20" Color="Red" 
    v2:Opacity="0.5" />
  <Circle Center="13,0" Radius="20" Color="Yellow" 
    v2:Opacity="0.5" />
  <Circle Center="38,0" Radius="20" Color="Green" 
    v2:Opacity="0.5" />
  <AddIn Center="25,10" Radius="10" CodeBase=
        Because the TextFlow specification does not make use
        of Markup Compatibility elements and attributes,
        the TextFlow processor would consider the presence
        of an mc:Ignorable attribute to be an error condition.
        Because the TextFlow specification is completely
        unaware of all versions of the Circles specification,
        the TextFlow processor would also consider the 
        presence of a Circle or v2:Ellipse element to be an
        error condition.
      <Paragraph>How are <Bold>you</Bold>?</Paragraph>