Skip to content

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.

ColumnRequiredMeaning
idyesStable field id, prefix:code.
classyesClass the row belongs to.
propertyNameyesJSON property name of the field in the document.
pathDotted path for people reading the sheet.
label_singular_enyesEnglish label.
label_plural_enEnglish plural label for repeatable fields.
parentyesid of the parent row.
datatypeyesType of the value.
optional_free_textLets the user write free text instead of the structured value: the schema becomes oneOf of the type and a text type.
multlingualThe value can be given per language.
min_occurrencesMinimum number of values.
max_occurrencesMaximum number of values.
validation_patternRegular expression the value must match.
ui_hintEditor hint.
allowed_schemasIdentifier schemes offered for a TypedValue field.
extra_confJSON 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}"}