DiGIR request and response formats are specified via a number of XML Schema documents. The primary structure of a request or response is specified in the protocol XML Schema (digir.xsd). For the latest version(s) see:
http://digir.sourceforge.net/prot
The available data elements, and their types, for searching and returning in a request or response are specified in a federation (or content) schema. A current federation schema and excellent example is that representing the Darwin Core V2 dataset (darwin2.xsd). For the latest version(s) see:
http://digir.sourceforge.net/fed/Additionally, predefined record structures for responses can be defined and some examples of such (brief and full) exist in the above location.
As abstract elements, one cannot create concrete instances of them. The elements are provided to be used as substitutionGroups when content data elements are defined in federation schema. They act as placeholders in the protocol schema within the filter (particularly within COPs) structure.
In terms of data defined within a federation schema, it can be either searchable, returnable or both. Because XML Schema does not allow the use of multiple substitutionGroups per single element, each combination had to be created as its own element. One might consider why we did not create types and a complex inheritance tree to achieve the sort of typing we desired. The answer is two fold: 1) instance documents would not be as clean without the use of substitutionGroups and 2) XML Schema does not support multiple inheritance.
Examining how substitutionGroups were used here, one can think of them as acting like tag interfaces in java. In specific, in java there is an interface called Serializable and objects can implement this interface when they are serializable. Although there is no contract about supported implementation here, we have, in effect, tagged a data element as searchable, returnable, or both by specifying its substitutionGroup as one of the above. This is an important tehnique which one might find used elsewhere within the protocol schema.
One other note regarding these substituionGroups is the alpha and numeric versions of each. Clearly this is not an exhaustive type set, so I believe these will be somewhat shortlived. The idea behind having "typed" substitutionGroups is to allow comparison operators (COPs) to only deal with data of the sort valid for that particular operator. Consider the LIKE operator which can only accep alphanumeric data. If typing was not done in any manner here, the advantage of parser validation on an instance document would be lost and would have to be done at the provider itself. Its a nice idea but shortlived because as the datasets become more complex and as providers support more (or less) diverse sets of operators for each data element, these two generalized types (alpha and numeric) will not buy much. Eventually, each provider will specify in its own metadata the data elements and operators supported for each element. At that point, the use of the alpha and numeric can be removed and one can just deal with data in a general sense.
<xsd:element name="Collector" type="digir:stringData" substitutionGroup="digir:alphaSearchableReturnableData" nillable="true"/>
And here is how that the Collector column that is not supported would look in the results:
<darwin:Collector supported="false" xsi:nil="true"/>
It is important to note that supported and null are two separate and distinct conditions.
<xsd:group name="BoundingBoxPoints">
<xsd:sequence>
<xsd:element name="minLatitude" type="digir:decimalData" nillable="true"/>
<xsd:element name="maxLatitude" type="digir:decimalData" nillable="true"/>
<xsd:element name="minLogitude" type="digir:decimalData" nillable="true"/>
<xsd:element name="maxLogitude" type="digir:decimalData" nillable="true"/>
</xsd:sequence>
</xsd:group>
<xsd:element name="BoundingBox" substitutionGroup="digir:searchableData" nillable="true">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="digir:complexData">
<xsd:sequence>
<xsd:group ref="BoundingBoxPoints" minOccurs="0"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
(Note the additional use of a group here. The benefit is that now our schema will allow instance documents to have all the elements of the group or none of the elements of the group, but no partial mix of the points will be valid.)
<xsd:element name="Collector" type="digir:stringData" substitutionGroup="digir:alphaSearchableReturnableData" nillable="true"/>
And how the element looks as null in the results:
<darwin:Collector xsi:nil="true"/>
<xsd:element name="Collector" type="digir:stringData" substitutionGroup="digir:alphaSearchableReturnableData" nillable="true"/>
<xsd:element name="requiredList" substitutionGroup="digir:requiredList" abstract="true">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="DateLastModified "/>
<xsd:element ref="InstitutionCode"/>
<xsd:element ref="CollectionCode"/>
<xsd:element ref="CatalogNumber"/>
<xsd:element ref="ScientificName"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
This should be done in all federation schema but the list (sequence) could contain no elements.