Worked Examples¶
Warning
SDMX 3.2 has not been released and is currently in internal review, so the syntax shown on this page is provisional and may change as a result of the review process. See the introduction for details.
Three complete examples of custom structures, building up from a simple maintainable definition to an item scheme, and finally to a definition which chains indirect references.
Every example is shown in both SDMX-ML 3.2 and SDMX-JSON 2.2. Message headers are omitted for brevity; a real submission wraps the content in a message:Structure document with a message:Header.
Example 1 - a Pivot Table¶
The IMF wants to publish the concept of a Pivot Table: a description of how a Dataflow should be laid out as a table, saying which Dimension provides the rows, which provides the columns, and which are held fixed as slices. No SDMX class describes this, so it becomes a Custom Structure Definition.
The requirements are:
- a Pivot Table is built over exactly one Dataflow;
- it has any number of rows, columns and slices;
- a row or column is nameable, refers to a Dimension of that Dataflow, has an optional nesting level, and has a heading which is either free text or a reference to a Code;
- a slice is everything a row or column is, plus a position.
The definition¶
Rows and columns share a type, so a single RowColType custom type is declared and used by both. A slice is a row or column with an extra property, so SliceType extends RowColType. The dimension property is an indirect reference resolved against the dataflow property declared at the root of the definition, which is why a row only has to report SEX rather than a full Dimension URN.
<str:CustomStructureDefinitions>
<str:CustomStructureDefinition agencyID="IMF" id="PIVOT_TABLE" version="1.0.0"
sdmxClassName="PivotTable">
<com:Name xml:lang="en">Pivot Table</com:Name>
<str:Property id="rows" minOccurs="0">
<str:CustomTypeReference type="RowColType"/>
</str:Property>
<str:Property id="cols" minOccurs="0">
<str:CustomTypeReference type="RowColType"/>
</str:Property>
<str:Property id="slice" minOccurs="0">
<str:CustomTypeReference type="SliceType"/>
</str:Property>
<str:Property id="dataflow" maxOccurs="1">
<str:Reference>
<str:Target class="Dataflow"/>
</str:Reference>
</str:Property>
<str:CustomType id="RowColType" extends="Nameable" sdmxClassName="PivotTableRowCol">
<com:Name xml:lang="en">RowCol</com:Name>
<str:Property id="level" minOccurs="0" maxOccurs="1">
<str:ValueFormat textType="Integer" minValue="0"/>
</str:Property>
<str:Property id="dimension" maxOccurs="1">
<str:IndirectReference targetClass="Dimension" context="dataflow"/>
</str:Property>
<str:Property id="headingText" maxOccurs="1">
<str:ValueFormat textType="String"/>
</str:Property>
<str:Property id="headingCode" maxOccurs="1">
<str:Reference>
<str:Target class="Code"/>
</str:Reference>
</str:Property>
<str:MutuallyExclusive>
<str:Member property="headingText"/>
<str:Member property="headingCode"/>
</str:MutuallyExclusive>
</str:CustomType>
<str:CustomType id="SliceType" extendsType="RowColType" sdmxClassName="PivotTableSlice">
<com:Name xml:lang="en">Slice</com:Name>
<str:Property id="position" minOccurs="0" maxOccurs="1">
<str:ValueFormat textType="Integer" minValue="0"/>
</str:Property>
</str:CustomType>
</str:CustomStructureDefinition>
</str:CustomStructureDefinitions>
{
"data": {
"customStructureDefinitions": [
{
"id": "PIVOT_TABLE",
"agencyID": "IMF",
"version": "1.0.0",
"names": {"en": "Pivot Table"},
"sdmxClassName": "PivotTable",
"properties": [
{"id": "rows", "minOccurs": 0, "customType": "RowColType"},
{"id": "cols", "minOccurs": 0, "customType": "RowColType"},
{"id": "slice", "minOccurs": 0, "customType": "SliceType"},
{"id": "dataflow", "maxOccurs": 1, "reference": ["Dataflow"]}
],
"customTypes": [
{
"id": "RowColType",
"names": {"en": "RowCol"},
"extends": "Nameable",
"sdmxClassName": "PivotTableRowCol",
"properties": [
{"id": "level", "minOccurs": 0, "maxOccurs": 1,
"format": {"minValue": 0, "dataType": "Integer"}},
{"id": "dimension", "maxOccurs": 1,
"indirectReference": {"targetClass": "Dimension", "context": "dataflow"}},
{"id": "headingText", "maxOccurs": 1,
"format": {"dataType": "String"}},
{"id": "headingCode", "maxOccurs": 1, "reference": ["Code"]}
],
"mutuallyExclusive": [["headingCode", "headingText"]]
},
{
"id": "SliceType",
"names": {"en": "Slice"},
"extendsType": "RowColType",
"sdmxClassName": "PivotTableSlice",
"properties": [
{"id": "position", "minOccurs": 0, "maxOccurs": 1,
"format": {"minValue": 0, "dataType": "Integer"}}
]
}
]
}
]
}
}
Comparing the two tabs shows that cardinality is expressed the same way in both formats. rows, cols and slice are unbounded, so neither format writes a maxOccurs at all; dataflow is single valued, so both state it explicitly.
Submitting this definition creates the class custom.imf.PivotTable - the class name PivotTable qualified by the Agency which maintains the definition - and registers the REST API resource imf:pivottable.
An instance¶
The OECD now creates a Pivot Table over its own population Dataflow. The rows use a free text heading, the columns reference a Code as their heading, and the slice uses the extra position property of SliceType.
<str:CustomStructures>
<pivottable:PivotTable
xmlns:pivottable="urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF:PIVOT_TABLE(1.0.0)"
agencyID="OECD" id="POP" version="1.0.0">
<com:Name xml:lang="en">Population Pivot</com:Name>
<pivottable:CustomStructureDefinition>urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF:PIVOT_TABLE(1.0.0)</pivottable:CustomStructureDefinition>
<pivottable:dataflow>urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=OECD:DF_POP(1.0.0)</pivottable:dataflow>
<pivottable:rows id="SEX">
<com:Name xml:lang="en">Sex</com:Name>
<pivottable:dimension>SEX</pivottable:dimension>
<pivottable:headingText>By sex</pivottable:headingText>
</pivottable:rows>
<pivottable:cols id="AGE">
<com:Name xml:lang="en">Age</com:Name>
<pivottable:dimension>AGE</pivottable:dimension>
<pivottable:headingCode>urn:sdmx:org.sdmx.infomodel.codelist.Code=SDMX:CL_AGE(1.0).TOTAL</pivottable:headingCode>
</pivottable:cols>
<pivottable:slice id="TIME">
<com:Name xml:lang="en">Time</com:Name>
<pivottable:dimension>TIME_PERIOD</pivottable:dimension>
<pivottable:position>0</pivottable:position>
</pivottable:slice>
</pivottable:PivotTable>
</str:CustomStructures>
{
"data": {
"customStructures": [
{
"id": "POP",
"agencyID": "OECD",
"version": "1.0.0",
"names": {"en": "Population Pivot"},
"customStructureDefinition": "urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF:PIVOT_TABLE(1.0.0)",
"dataflow": "urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=OECD:DF_POP(1.0.0)",
"rows": [
{
"id": "SEX",
"names": {"en": "Sex"},
"dimension": "SEX",
"headingText": "By sex"
}
],
"cols": [
{
"id": "AGE",
"names": {"en": "Age"},
"dimension": "AGE",
"headingCode": "urn:sdmx:org.sdmx.infomodel.codelist.Code=SDMX:CL_AGE(1.0).TOTAL"
}
],
"slice": [
{
"id": "TIME",
"names": {"en": "Time"},
"dimension": "TIME_PERIOD",
"position": "0"
}
]
}
]
}
}
Points worth noting:
- the instance is maintained by
OECD, but its URN isurn:sdmx:org.sdmx.infomodel.custom.imf.PivotTable=OECD:POP(1.0.0)because the class belongs to the IMF's definition; - each row, column and slice is nameable, so each is given a URN of its own, for example
urn:sdmx:org.sdmx.infomodel.custom.imf.PivotTableRowCol=OECD:POP(1.0.0).SEX. The slice uses its own class,PivotTableSlice; dimensionvalues are bare identifiers, resolved against the Dataflow. Submission fails if any of them is not a Dimension of the Dataflow's Data Structure Definition;rowsreportsheadingTextandcolsreportsheadingCode. Reporting both on the same object would breach theMutuallyExclusiveset.
Example 2 - a Glossary as an item scheme¶
A Glossary is a list of terms, so its instances should behave like an item scheme: individually addressable items, individual item queries, and partial responses. This is what base="ItemScheme" provides.
The requirements are:
- a Glossary contains any number of terms;
- a term has an identifier and a name (both provided by the
Nameablebase) and a definition which can be given in several languages; - a term may contain narrower terms.
The definition¶
The items property is reserved for the items of the scheme and is mandatory for an item scheme based definition. The hierarchy is explicit: TermType declares a children property of its own type.
<str:CustomStructureDefinitions>
<str:CustomStructureDefinition agencyID="IMF" id="GLOSSARY" version="1.0.0"
sdmxClassName="Glossary" base="ItemScheme">
<com:Name xml:lang="en">Glossary</com:Name>
<str:Property id="items" minOccurs="0">
<str:CustomTypeReference type="TermType"/>
</str:Property>
<str:CustomType id="TermType" extends="Nameable" sdmxClassName="GlossaryTerm">
<com:Name xml:lang="en">Term</com:Name>
<str:Property id="definition" minOccurs="0">
<str:ValueFormat textType="String" isMultiLingual="true"/>
</str:Property>
<str:Property id="children" minOccurs="0">
<str:CustomTypeReference type="TermType"/>
</str:Property>
</str:CustomType>
</str:CustomStructureDefinition>
</str:CustomStructureDefinitions>
{
"data": {
"customStructureDefinitions": [
{
"id": "GLOSSARY",
"agencyID": "IMF",
"version": "1.0.0",
"names": {"en": "Glossary"},
"sdmxClassName": "Glossary",
"base": "ItemScheme",
"properties": [
{"id": "items", "minOccurs": 0, "customType": "TermType"}
],
"customTypes": [
{
"id": "TermType",
"names": {"en": "Term"},
"extends": "Nameable",
"sdmxClassName": "GlossaryTerm",
"properties": [
{"id": "definition", "minOccurs": 0,
"format": {"dataType": "String", "isMultiLingual": true}},
{"id": "children", "minOccurs": 0, "customType": "TermType"}
]
}
]
}
]
}
}
An instance¶
<str:CustomStructures>
<glossary:Glossary
xmlns:glossary="urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF:GLOSSARY(1.0.0)"
agencyID="ECB" id="STAT_GLOSSARY" version="1.0.0">
<com:Name xml:lang="en">Statistical Glossary</com:Name>
<glossary:CustomStructureDefinition>urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF:GLOSSARY(1.0.0)</glossary:CustomStructureDefinition>
<glossary:items id="GDP">
<com:Name xml:lang="en">Gross Domestic Product</com:Name>
<glossary:definition xml:lang="en">The total monetary value of all final goods and services produced within a country in a given period.</glossary:definition>
<glossary:definition xml:lang="fr">La valeur monetaire totale de tous les biens et services finaux produits dans un pays sur une periode donnee.</glossary:definition>
<glossary:children id="GDP_PC">
<com:Name xml:lang="en">GDP per capita</com:Name>
<glossary:definition xml:lang="en">Gross domestic product divided by the population of the country.</glossary:definition>
</glossary:children>
</glossary:items>
<glossary:items id="CPI">
<com:Name xml:lang="en">Consumer Price Index</com:Name>
<glossary:definition xml:lang="en">A measure of the average change over time in the prices paid by consumers for a basket of goods and services.</glossary:definition>
</glossary:items>
</glossary:Glossary>
</str:CustomStructures>
{
"data": {
"customStructures": [
{
"id": "STAT_GLOSSARY",
"agencyID": "ECB",
"version": "1.0.0",
"names": {"en": "Statistical Glossary"},
"customStructureDefinition": "urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF:GLOSSARY(1.0.0)",
"items": [
{
"id": "GDP",
"names": {"en": "Gross Domestic Product"},
"definition": [
{"locale": "en", "value": "The total monetary value of all final goods and services produced within a country in a given period."},
{"locale": "fr", "value": "La valeur monetaire totale de tous les biens et services finaux produits dans un pays sur une periode donnee."}
],
"children": [
{
"id": "GDP_PC",
"names": {"en": "GDP per capita"},
"definition": [
{"locale": "en", "value": "Gross domestic product divided by the population of the country."}
]
}
]
},
{
"id": "CPI",
"names": {"en": "Consumer Price Index"},
"definition": [
{"locale": "en", "value": "A measure of the average change over time in the prices paid by consumers for a basket of goods and services."}
]
}
]
}
]
}
}
The resulting URNs show the item scheme package and the item hierarchy:
urn:sdmx:org.sdmx.infomodel.custom.itemscheme.imf.Glossary=ECB:STAT_GLOSSARY(1.0.0)
urn:sdmx:org.sdmx.infomodel.custom.itemscheme.imf.GlossaryTerm=ECB:STAT_GLOSSARY(1.0.0).GDP
urn:sdmx:org.sdmx.infomodel.custom.itemscheme.imf.GlossaryTerm=ECB:STAT_GLOSSARY(1.0.0).GDP.GDP_PC
urn:sdmx:org.sdmx.infomodel.custom.itemscheme.imf.GlossaryTerm=ECB:STAT_GLOSSARY(1.0.0).CPI
A single term can be retrieved with an item query, which returns the scheme as partial:
Example 3 - chained indirect references¶
This example, describing how a data collection table is laid out, shows two features which the earlier examples do not: an indirect reference whose context is itself an indirect reference, and a definition maintained by a sub Agency.
The DimensionValueType custom type describes a fixed key value such as FREQ=A:
dimensionis an indirect reference to aDimension, resolved against thedataflowproperty at the root of the definition;codeIdis an indirect reference to aCode, resolved againstdimension. To resolvecodeId, thedimensionvalue must be resolved to a Dimension URN first, and then followed to the Codelist which enumerates it;- a key value is either coded (
codeId) or free text (value), never both.
HeaderType is recursive - a header may contain sub headers - and is Identifiable rather than Nameable, using a multilingual label property instead of the SDMX name.
The definition¶
<str:CustomStructureDefinitions>
<str:CustomStructureDefinition agencyID="IMF.STA" id="COLLECTION_TABLE" version="1.0.0"
sdmxClassName="CollectionTable">
<com:Name xml:lang="en">Data Collection Table</com:Name>
<str:Property id="dataflow" maxOccurs="1">
<str:Reference>
<str:Target class="Dataflow"/>
</str:Reference>
</str:Property>
<str:Property id="header" minOccurs="0">
<str:CustomTypeReference type="HeaderType"/>
</str:Property>
<str:Property id="row" minOccurs="0">
<str:CustomTypeReference type="HeaderType"/>
</str:Property>
<str:Property id="slice" minOccurs="0">
<str:CustomTypeReference type="HeaderType"/>
</str:Property>
<str:CustomType id="DimensionValueType" extends="Annotatable">
<com:Name xml:lang="en">Key Value Pair</com:Name>
<str:Property id="dimension" maxOccurs="1">
<str:Description>Dimension ID</str:Description>
<str:IndirectReference targetClass="Dimension" context="dataflow"/>
</str:Property>
<str:Property id="codeId" maxOccurs="1">
<str:Description>Coded Dimension Value</str:Description>
<str:IndirectReference targetClass="Code" context="dimension"/>
</str:Property>
<str:Property id="value" maxOccurs="1">
<str:Description>Free text Dimension Value</str:Description>
<str:ValueFormat textType="String"/>
</str:Property>
<str:MutuallyExclusive>
<str:Member property="codeId"/>
<str:Member property="value"/>
</str:MutuallyExclusive>
</str:CustomType>
<str:CustomType id="HeaderType" extends="Identifiable" sdmxClassName="Header">
<com:Name xml:lang="en">Table Header, Row, or Slice</com:Name>
<str:Property id="label" maxOccurs="1">
<str:ValueFormat textType="String" isMultiLingual="true"/>
</str:Property>
<str:Property id="abstract" minOccurs="0" maxOccurs="1">
<str:ValueFormat textType="Boolean"/>
</str:Property>
<str:Property id="measure" minOccurs="0" maxOccurs="1">
<str:Description>Measure Dimension</str:Description>
<str:IndirectReference targetClass="Measure" context="dataflow"/>
</str:Property>
<str:Property id="keyValue" minOccurs="0">
<str:Description>Zero to many fixed key values related to this header, example FREQ:A, REF_AREA:UK</str:Description>
<str:CustomTypeReference type="DimensionValueType"/>
</str:Property>
<str:Property id="openDimension" maxOccurs="1">
<str:Description>Reference to the Dimension which provides the values for this cell</str:Description>
<str:IndirectReference targetClass="Dimension" context="dataflow"/>
</str:Property>
<str:Property id="header" minOccurs="0">
<str:CustomTypeReference type="HeaderType"/>
</str:Property>
<str:MutuallyExclusive>
<str:Member property="keyValue"/>
<str:Member property="openDimension"/>
</str:MutuallyExclusive>
</str:CustomType>
</str:CustomStructureDefinition>
</str:CustomStructureDefinitions>
{
"data": {
"customStructureDefinitions": [
{
"id": "COLLECTION_TABLE",
"agencyID": "IMF.STA",
"version": "1.0.0",
"names": {"en": "Data Collection Table"},
"sdmxClassName": "CollectionTable",
"properties": [
{"id": "dataflow", "maxOccurs": 1, "reference": ["Dataflow"]},
{"id": "header", "minOccurs": 0, "customType": "HeaderType"},
{"id": "row", "minOccurs": 0, "customType": "HeaderType"},
{"id": "slice", "minOccurs": 0, "customType": "HeaderType"}
],
"customTypes": [
{
"id": "DimensionValueType",
"names": {"en": "Key Value Pair"},
"extends": "Annotatable",
"properties": [
{"id": "dimension", "maxOccurs": 1,
"description": "Dimension ID",
"indirectReference": {"targetClass": "Dimension", "context": "dataflow"}},
{"id": "codeId", "maxOccurs": 1,
"description": "Coded Dimension Value",
"indirectReference": {"targetClass": "Code", "context": "dimension"}},
{"id": "value", "maxOccurs": 1,
"description": "Free text Dimension Value",
"format": {"dataType": "String"}}
],
"mutuallyExclusive": [["codeId", "value"]]
},
{
"id": "HeaderType",
"names": {"en": "Table Header, Row, or Slice"},
"extends": "Identifiable",
"sdmxClassName": "Header",
"properties": [
{"id": "label", "maxOccurs": 1,
"format": {"dataType": "String", "isMultiLingual": true}},
{"id": "abstract", "minOccurs": 0, "maxOccurs": 1,
"format": {"dataType": "Boolean"}},
{"id": "measure", "minOccurs": 0, "maxOccurs": 1,
"description": "Measure Dimension",
"indirectReference": {"targetClass": "Measure", "context": "dataflow"}},
{"id": "keyValue", "minOccurs": 0,
"description": "Zero to many fixed key values related to this header, example FREQ:A, REF_AREA:UK",
"customType": "DimensionValueType"},
{"id": "openDimension", "maxOccurs": 1,
"description": "Reference to the Dimension which provides the values for this cell",
"indirectReference": {"targetClass": "Dimension", "context": "dataflow"}},
{"id": "header", "minOccurs": 0, "customType": "HeaderType"}
],
"mutuallyExclusive": [["keyValue", "openDimension"]]
}
]
}
]
}
}
Because the definition is maintained by IMF.STA, instances have URNs in the package custom.imf.sta, for example urn:sdmx:org.sdmx.infomodel.custom.imf.sta.CollectionTable=IMF:NSDP(1.0.0), and the REST API resource for them is imf.sta:collectiontable.
Note also that dataflow is declared only once, at the root of the definition, but is used as the resolution context by properties nested several levels deep inside HeaderType and DimensionValueType. The context property is looked up in the closest enclosing scope which reports it, so a root level reference serves the whole instance.
An instance¶
The IMF collects a standard set of indicators for the National Summary Data Page (NSDP) which countries publish under the e-GDDS framework. Laid out as a Collection Table over the NSDP Dataflow: the column headers are open over TIME_PERIOD, each row fixes an indicator and a frequency, the indicator rows are grouped under an abstract Real Sector heading, and a slice pins the reference area.
<str:CustomStructures>
<ct:CollectionTable
xmlns:ct="urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF.STA:COLLECTION_TABLE(1.0.0)"
agencyID="IMF" id="NSDP" version="1.0.0">
<com:Name xml:lang="en">National Summary Data Page</com:Name>
<ct:CustomStructureDefinition>urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF.STA:COLLECTION_TABLE(1.0.0)</ct:CustomStructureDefinition>
<ct:dataflow>urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=IMF.STA:DF_NSDP(1.0.0)</ct:dataflow>
<ct:header id="PERIODS">
<ct:label xml:lang="en">Latest periods</ct:label>
<ct:openDimension>TIME_PERIOD</ct:openDimension>
</ct:header>
<ct:row id="REAL">
<ct:label xml:lang="en">Real Sector</ct:label>
<ct:abstract>true</ct:abstract>
<ct:header id="NGDP">
<ct:label xml:lang="en">National Accounts (GDP)</ct:label>
<ct:keyValue>
<ct:dimension>INDICATOR</ct:dimension>
<ct:codeId>NGDP</ct:codeId>
</ct:keyValue>
<ct:keyValue>
<ct:dimension>FREQ</ct:dimension>
<ct:codeId>Q</ct:codeId>
</ct:keyValue>
</ct:header>
<ct:header id="PCPI">
<ct:label xml:lang="en">Consumer Price Index</ct:label>
<ct:keyValue>
<ct:dimension>INDICATOR</ct:dimension>
<ct:codeId>PCPI</ct:codeId>
</ct:keyValue>
<ct:keyValue>
<ct:dimension>FREQ</ct:dimension>
<ct:codeId>M</ct:codeId>
</ct:keyValue>
</ct:header>
</ct:row>
<ct:slice id="COUNTRY">
<ct:label xml:lang="en">Reference Area</ct:label>
<ct:keyValue>
<ct:dimension>REF_AREA</ct:dimension>
<ct:codeId>GB</ct:codeId>
</ct:keyValue>
</ct:slice>
</ct:CollectionTable>
</str:CustomStructures>
{
"data": {
"customStructures": [
{
"id": "NSDP",
"agencyID": "IMF",
"version": "1.0.0",
"names": {"en": "National Summary Data Page"},
"customStructureDefinition": "urn:sdmx:org.sdmx.infomodel.csd.CustomStructureDefinition=IMF.STA:COLLECTION_TABLE(1.0.0)",
"dataflow": "urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=IMF.STA:DF_NSDP(1.0.0)",
"header": [
{
"id": "PERIODS",
"label": [{"locale": "en", "value": "Latest periods"}],
"openDimension": "TIME_PERIOD"
}
],
"row": [
{
"id": "REAL",
"label": [{"locale": "en", "value": "Real Sector"}],
"abstract": "true",
"header": [
{
"id": "NGDP",
"label": [{"locale": "en", "value": "National Accounts (GDP)"}],
"keyValue": [
{"dimension": "INDICATOR", "codeId": "NGDP"},
{"dimension": "FREQ", "codeId": "Q"}
]
},
{
"id": "PCPI",
"label": [{"locale": "en", "value": "Consumer Price Index"}],
"keyValue": [
{"dimension": "INDICATOR", "codeId": "PCPI"},
{"dimension": "FREQ", "codeId": "M"}
]
}
]
}
],
"slice": [
{
"id": "COUNTRY",
"label": [{"locale": "en", "value": "Reference Area"}],
"keyValue": [
{"dimension": "REF_AREA", "codeId": "GB"}
]
}
]
}
]
}
}
Points worth noting:
- headers are objects of the
Identifiablecustom typeHeaderType, so each carries anidand is given a URN which reflects its nesting, for exampleurn:sdmx:org.sdmx.infomodel.custom.imf.sta.Header=IMF:NSDP(1.0.0).REAL.NGDP; - the
REALrow is a grouping row: it setsabstractand reports neitherkeyValuenoropenDimension, which is permitted because those two properties are members of a mutually exclusive set and are therefore in practice optional; - each
keyValueis an object of theAnnotatabletypeDimensionValueType, so it is anonymous - noid, no URN; - every
codeIdexercises the chained indirect reference:NGDPis resolved in the context of theINDICATORdimension, which is itself resolved in the context of thedataflowdeclared once at the root. Submission fails if the Code is not in the Codelist which enumerates that Dimension.
Next¶
- Web Services - submitting and querying these structures.