Sheet columns
Each tab describes one profile (or the type library, tab SideDoc). One row per field; one row with datatype Class defines the profile root. Rows nest through the parent column. Cell values are trimmed.
Source: GenJSONSchema/sheet-columns.json in the schemas repository, written from GenJSONSchema/schemaGen.py. Column names must match exactly.
| Column | Required | Meaning |
|---|---|---|
id | yes | Stable field id, prefix:code. |
class | yes | Class the row belongs to. |
propertyName | yes | JSON property name of the field in the document. |
path | Dotted path for people reading the sheet. | |
label_singular_en | yes | English label. |
label_plural_en | English plural label for repeatable fields. | |
parent | yes | id of the parent row. |
datatype | yes | Type of the value. |
optional_free_text | Lets the user write free text instead of the structured value: the schema becomes oneOf of the type and a text type. | |
multlingual | The value can be given per language. | |
min_occurrences | Minimum number of values. | |
max_occurrences | Maximum number of values. | |
validation_pattern | Regular expression the value must match. | |
ui_hint | Editor hint. | |
allowed_schemas | Identifier schemes offered for a TypedValue field. | |
extra_conf | JSON for what the other columns cannot say. |
id
Stable field id, prefix:code. Becomes x-sidedoc.id. Help texts, mappings and documents refer to fields by it, so never change or reuse an id; give a new field a new id between its neighbours.
- Required: yes
- Allowed values: prefix:code, matching ^[a-z][a-z0-9-]*:[A-Za-z0-9_.-]+$. Root row: prefix:v<nnnnn>. Fields: prefix:f<nnnnn> (type library: sd:t<nnnnn> or sd:f<nnnnn>).
- Example:
ds:f00100
class
Class the row belongs to. In a profile tab every row has the profile's class name; in the type-library tab it is the type (Agent, Literal, ...) or SideDoc for the rows that declare the types.
- Required: yes
- Allowed values: A class name. Exactly one row per tab has datatype Class; its class is the root.
- Example:
Datasheet
propertyName
JSON property name of the field in the document. Rows without one (the Class row) are not properties.
- Required: yes
- Allowed values: lowerCamelCase, unique among siblings. In the type library, a SideDoc row whose propertyName is a type name defines that type, and its extra_conf holds type-level JSON Schema.
- Example:
distributionTitle
path
Dotted path for people reading the sheet. Not read by schemaGen.py; nesting comes from parent.
- Required: no
- Allowed values: Class.property.sub
- Example:
Datasheet.distribution.distributionTitle
label_singular_en
English label. Becomes x-sidedoc.labelSingularEn. On the Class row it is the profile name shown in the editor.
- Required: yes
- Allowed values: Text, sentence case.
- Example:
Distribution title
label_plural_en
English plural label for repeatable fields. Becomes x-sidedoc.labelPluralEn when filled in.
- Required: no
- Allowed values: Text.
- Example:
Download URLs
parent
id of the parent row. A row whose parent is another row of the same class becomes a sub-field of that row; otherwise it is a top-level property of the class.
- Required: yes
- Allowed values: An id from the same tab.
- Example:
ds:f01300
datatype
Type of the value. A type-library type gives a $ref to it; Container (or any row with children) gives an object with sub-fields; a row with children and another datatype gets that type as _value next to the sub-fields. Becomes x-sidedoc.type.
- Required: yes
- Allowed values: Class (root row only); a type-library type: Literal, RichText, Enum, Term, Url, Date, DateTime, TypedValue, Agent, Reference, QualifiedRelation, Container; LangMap (language-keyed strings); JSON.string; JSON.object. A union is written A|B, for example Term|Literal; it becomes oneOf and x-sidedoc.unionTypes. Unknown names fall back to a string.
- Example:
Term|Literal
optional_free_text
Lets the user write free text instead of the structured value: the schema becomes oneOf of the type and a text type. Becomes x-sidedoc.optionalFreeText.
- Required: no
- Allowed values: FALSE or empty: off. TRUE, yes, 1, richtext, rich or formatted: free text as RichText. literal, simple or plain: free text as Literal.
- Example:
TRUE
multlingual
The value can be given per language. Becomes x-sidedoc.multilingual. Literal, RichText, Enum, Term, Agent and Reference hold their languages inside the value, so for them only the flag is set; other types get an array of language variants. Note the spelling: schemaGen.py reads multlingual. A column headed multilingual (as in the DCAT-AP tab in 0.2.2) is ignored and every field gets multilingual false.
- Required: no
- Allowed values: TRUE or FALSE (only TRUE, in any case, counts).
- Example:
TRUE
min_occurrences
Minimum number of values. 1 or more makes the property required (and a single required string non-empty). Becomes x-sidedoc.minOccurrences.
- Required: no
- Allowed values: Integer; empty = 0.
- Example:
1
max_occurrences
Maximum number of values. 1 gives a single value; anything else gives an array, with maxItems when above 1. Becomes x-sidedoc.maxOccurrences.
- Required: no
- Allowed values: Integer; -1 = no limit; empty = 0, which also means no limit.
- Example:
-1
validation_pattern
Regular expression the value must match. Kept as written in x-sidedoc.validationPattern and written as a JSON Schema pattern. A plain /regex/ is only applied to JSON.string fields; for typed fields name the sub-field. Escaped braces { } are rewritten to [{] [}], and doubled backslashes from the sheet are undone. A malformed value stops the build.
- Required: no
- Allowed values: /regex/; or JSON {"subField": "/regex/"}; or subField=/regex/|other=/regex/. Dots in sub-field names address nested sub-fields.
- Example:
{"href":"/^https?:\/\/.+$/"}
ui_hint
Editor hint. Becomes x-sidedoc.uiHint, except title, which becomes x-sidedoc.isTitle.
- Required: no
- Allowed values: title, url, email, date_picker, datetime_picker, year, enum_lookup, enum_select, term_lookup, identifier, identifier_agent, language_code, checksum, multiline, bibtex, doi, text. The list is defined in GenJSONSchema/x-sidedoc.schema.json; scripts/schema_lint.py rejects other values.
- Example:
term_lookup
allowed_schemas
Identifier schemes offered for a TypedValue field. Becomes x-sidedoc.allowedSchemas. A malformed value stops the build.
- Required: no
- Allowed values: JSON array of {"uri": ..., "label": ...}.
- Example:
[{"uri":"https://doi.org/","label":"DOI"},{"uri":"https://hdl.handle.net/","label":"Handle"}]
extra_conf
JSON for what the other columns cannot say. caption and dateMode are field-level hints (x-sidedoc.caption, x-sidedoc.dateMode). Any other key names a sub-field of the referenced type: the type is copied inline and the given x-sidedoc keys are set on that sub-field. On the type-library row that defines a type, the keys are merged into the type's JSON Schema (for example a oneOf). A malformed value stops the build when sub-field overrides are applied.
- Required: no
- Allowed values: JSON object. {"caption": "{name}"}; {"dateMode": "single" | "interval"}; {"identifier": {"allowedSchemas": [...]}}.
- Example:
{"caption": "{distributionTitle}"}