This is the official repository of ISO/TC 211 XML (XSD) and JSON schemas, jointly managed by ISO/TC 211/XMG and Ribose.
The schemas are served at https://schemas.isotc211.org/ and published as interactive schema browsers built by two LutaML tools:
-
LutaML XSD (
lutaml-xsd) — parses XSD into.lxrpackages, validates resolution, and generates standalone HTML documentation. -
LutaML JSON Schema (
lutaml-jsonschema) — validates JSON schemas and generates interactive SPA documentation.
All XSD files follow the {standard}/{-part}/{module}/{version}/ pattern:
{standard}/{-part}/{module}/{version}/
{module}.xsd # Main schema entry point (3-letter lowercase)
*.xsd # Additional type/import schemas
*.sch # Schematron validation rules
index.adoc # Per-module documentation
*.png # UML/diagram images
examples/*.xml # Example XML instances| Component | Pattern | Example |
|---|---|---|
Standard |
5 digits |
|
Part |
|
|
Module |
3 lowercase letters matching the main XSD filename |
|
Version |
Semantic version |
|
{standard}/resources/
transforms/ # XSLT transform stylesheets
codelists/ # Codelist dictionary XML files
schematron/ # Cross-cutting Schematron rules
bundles/ # ZIP download packages
namespace-tools/ # Namespace information and tools
tools/ # Helper scripts and utilities
CHANGES.md # Per-standard maintenance logPackages define which schemas are grouped into a single interactive browser. Two manifest files define all packages:
lxr_packages.yml-
XSD (LXR) packages — each groups one or more
.xsdfiles ljr_packages.yml-
JSON (LJR) packages — each groups one or more
.jsonfiles
| Field | Required | Description |
|---|---|---|
|
Yes |
Unique package identifier (e.g. |
|
Yes |
Human-readable title for the browser |
|
Yes |
ISO standard number (e.g. |
|
Yes |
List of file paths relative to repo root |
|
No |
One of |
|
No |
Short description |
|
No |
Part identifier (e.g. |
- name: "19103-gco-1.2.0"
title: "ISO 19103 — Conceptual Schema Language (gco, gcx)"
standard: "19103"
status: "current"
description: "General conceptual schema language types and XML data types."
files:
- "19103/-/gco/1.2.0/gco.xsd"
- "19103/-/gcx/1.2.0/gcx.xsd"-
Create the directory and place schema files:
mkdir -p 19115/-1/new/1.0 # Place new.xsd (entry point), newType.xsd, etc. -
Optionally add Schematron rules, examples, and documentation:
19115/-1/new/1.0/ new.xsd # Main entry point (3-letter lowercase name) newType.xsd # Additional type definitions new.sch # Schematron rules (optional) index.adoc # Documentation (optional) examples/*.xml # Example instances (optional) -
Register in
lxr_packages.yml:- name: "19115-new-1.0" title: "ISO 19115-1 — New Module (new v1.0)" standard: "19115" status: "current" files: - "19115/-1/new/1.0/new.xsd"
-
Validate the manifest:
ruby tools/validate_manifests.rb
-
Test the package locally (see Local testing below).
-
Push — CI validates and builds automatically.
-
Create the directory and place schema files:
mkdir -p json/19115/-4/new/1.0 # Place new.json -
Register in
ljr_packages.yml:- name: "19115-4-json-1.0" title: "ISO 19115-4 — New Module JSON (v1.0)" standard: "19115" status: "current" files: - "json/19115/-4/new/1.0/new.json"
-
Validate the manifest:
ruby tools/validate_manifests.rb
-
Test the package locally (see Local testing below).
-
Push — CI validates and builds automatically.
Every JSON schema file in this repository MUST declare a $id that matches the
URL where the schema will be served. The site serves schemas at:
https://schemas.isotc211.org/json/{standard}/{-part}/{module}/{version}/{file}.json$id — set this to the served URL (the repo-relative file path prefixed
with https://schemas.isotc211.org/):
+
"$id": "https://schemas.isotc211.org/json/19115/-4/mdj/1.0.0/mdj.json"$ref to another ISO/TC 211 schema — use the target schema’s $id URL
with an anchor:
+
"$ref": "https://schemas.isotc211.org/json/19157/-1/dqc/1.0.0/dqc.json#DataQuality"$ref to an external schema — use the canonical external URL:
+
"$ref": "https://geojson.org/schema/Feature.json"|
Note
|
The correct URL prefix is https://schemas.isotc211.org/json/…; — there
is no /schemas/ segment between the domain and /json/.
|
-
Ruby 3.3+ with Bundler
-
Node.js 20+ (for
lutaml-jsonschemaSPA builds only)
Install gems:
bundle install# Validate structure, required keys, file existence, no duplicates
ruby tools/validate_manifests.rb
# List all referenced files (for piping to xmllint, json.tool, etc.)
ruby tools/validate_manifests.rb --list-filesBuild the .lxr package from the build template + your manifest entry:
# Generate a build config for your package
ruby -rjson -ryaml -e '
files = ["19115/-1/new/1.0/new.xsd"] # your file list
template = YAML.load_file("tools/lxr_build_template.yml")
template["metadata"]["name"] = "19115-new-1.0"
template["metadata"]["title"] = "ISO 19115-1 — New Module (new v1.0)"
template["files"] = files
File.write("build_config.yml", YAML.dump(template))
'
# Build the package
bundle exec lutaml-xsd build from-config build_config.yml \
--name "19115-new-1.0" \
--validate \
--output "pkg/19115-new-1.0.lxr"Validate that all type/element/group references resolve:
bundle exec lutaml-xsd build validate-resolution pkg/19115-new-1.0.lxr
# Use --strict to fail on warnings tooGenerate a standalone HTML browser to preview locally:
bundle exec lutaml-xsd spa pkg/19115-new-1.0.lxr \
--output pkg/19115-new-1.0.html \
--title "ISO 19115-1 — New Module"
# Open pkg/19115-new-1.0.html in a browserValidate the JSON schema file:
bundle exec lutaml-jsonschema validate json/19115/-4/new/1.0/new.jsonGenerate an SPA browser to preview:
bundle exec lutaml-jsonschema spa \
json/19115/-4/new/1.0/new.json \
--output pkg/19115-4-json-1.0 \
--title "ISO 19115-4 — New Module JSON"
# Open pkg/19115-4-json-1.0/index.html in a browserEvery push and pull request runs the full pipeline
(.github/workflows/ci.yml) in five stages:
| Stage | Description |
|---|---|
validate |
Runs |
setup-matrix |
Parses |
build-lxr (matrix) |
Runs in parallel — one job per LXR package:
1. Checks out |
build-ljr (matrix) |
Runs in parallel — one job per LJR package:
1. Checks out |
trigger-deploy |
On push to |
Each CI run produces downloadable artifacts for every package:
| Artifact | Format | Contents |
|---|---|---|
|
Binary |
LXR data package (resolved XSD model, for programmatic use) |
|
Single HTML file |
Standalone interactive XSD browser (works with |
|
ZIP archive |
LJR SPA directory (contains |
|
Artifact directory |
Same LJR SPA files (unzipped) |
Built packages are available as GitHub Actions artifacts:
-
Go to Actions in the repository.
-
Select the workflow run (green check = success).
-
Scroll to the Artifacts section at the bottom.
-
Click any artifact to download it:
-
19136-gml-1.0.lxr— the data package -
19136-gml-1.0.html— standalone HTML browser (open in any browser) -
19115-4-json-1.0.0.zip— zipped LJR SPA directory
-
|
Note
|
Artifacts are retained for 90 days. Each push to main produces a fresh
set. Artifacts from pull requests are available to collaborators.
|
The shared build template tools/lxr_build_template.yml provides:
metadata-
ISO/TC 211 branding, license, authorship, tags, and links. Applied to all LXR packages.
schema_location_mappings-
Rules for resolving
schemaLocationURLs to local files. Whenpattern: true, thefromfield is a regex andtosupports\1backreferences. First match wins, so order matters. Key mappings:-
schemas.isotc211.org/schemas/…URLs → strip the double/schemas/ -
schemas.isotc211.org/19110/{fcc,gfc}/…→ insert the missing-/ -
schemas.isotc211.org/…→ strip the domain prefix -
schemas.opengis.net/gml/3.2.1/…→ map to local19136/-/gml/1.0/ -
Legacy
standards.iso.org/…ISO GML URLs → same local copy
-
namespace_mappings-
Common namespace prefixes (
xs,gml,xlink). appearance-
Color scheme and typography for generated browsers.