Atom example
Atom Example for xsi:type Alias
Overview
In Atom (RFC 4287) there are several constructs where the content of the element is controlled by an attribute named 'type'. In most cases, these rules apply:
- If the value of the 'type' attribute is 'text', the content typed as xs:string
- If the value of the 'type' attribute is 'html', the content typed as xs:string
- If the value of the 'type' attribute is 'xhtml', the element contains one XHTML div element.
- If the value of the 'type' attribute is 'text/xml' (or other XML mime types), the element contains one XML element.
- If the value of the 'type' attribute is 'application/*' or "image/*", the content is typed as xs:base64Binary
In the case of the [atom:]content element, if the src attribute is present (which is a URI), the element must be empty.
Typing Content Using an xsi:type Alias
The proposal is to allow schema-defined mappings between attribute values and type names that mimic the functionality of [xsi:]type. The effect of this is to implicitly "add" an [xsi:]type attribute based on the value of a attribute (e.g. the 'type' attribute).
To handle the simple cases of a fixed enumeration of types, the following is proposed:
<xs:element name="summary" type='xs:TextBaseType'> <xs:when test="@type='text'" type='my:TextContent'/> <xs:when test="@type='html'" type='my:TextContent'/> <xs:when test="@type='xhtml'" type='my:XHTMLContent'/> <xs:when test="@type='xml'" type='my:XMLContent'/> <xs:when test="@type='image/jpeg'" type='my:BinaryContent'/> ... etc. ... </xs:element> <xs:complexType name="TextContent">...</xs:complexType> ... etc. ....
For Atom, we really want to have expressions for the mapping as we don't necessarily want to enumerate all the application or image mime types:
<xs:element name="summary" type='xs:TextBaseType'> <xs:when test="@type='text'" type='my:TextContent'/> <xs:when test="@type='html'" type='my:TextContent'/> <xs:when test="@type='xhtml'" type='my:XHTMLContent'/> <xs:when test="@type='xml'" type='my:XMLContent'/> <xs:when test="matches(@type,'^image/.*')" type='my:BinaryContent'/> <xs:when test="matches(@type,'^application/.*')" type='my:BinaryContent'/> </xs:element> <xs:complexType name="TextContent">...</xs:complexType> ... etc. ....
To begin with, we'd only allow attributes to be tested. The expressions would be tested in document order and the result would be a value for [xsi:]type and all the same rules for restriction/extension via xsi:type apply. That means that the type referenced on the [xs:]when element needs to restrict/extend type referenced on the [xs:]element element.
Unresolved
While this handles the assignment of type based on the type value, it does not handle the condition that if the 'src' attribute is present on the [atom:]content element, the element must be empty.