Thank you for your interest in contributing to the Studierendendaten XML Schema.
| Context | Language |
|---|---|
Schema content (xsd:documentation, element names) |
German |
| README | German |
| CONTRIBUTING, CHANGELOG | English |
| Commit messages, PR titles/descriptions | English |
| Code comments (justfile, flake.nix, CI) | English |
The project requires two tools for local development:
We recommend using Nix for a reproducible environment that provides both tools automatically:
nix developIf you prefer not to use Nix, install just and libxml2 through your system
package manager:
# macOS
brew install just libxml2
# Ubuntu/Debian
sudo apt-get install -y just libxml2-utilsAll validation is managed through a justfile. Run all checks with:
just validateIndividual recipes:
| Recipe | Description |
|---|---|
just validate-schema |
Checks that studierendendaten.xsd is well-formed and valid |
just validate-examples |
Validates all XML files in Beispieldateien/ against the XSD |
just check-encoding |
Verifies UTF-8 encoding declaration in all XML/XSD files |
just check-no-entities |
Scans for <!ENTITY declarations (eCH-0018 security rule) |
just validate |
Runs all of the above (default) |
GitHub Actions runs nix develop -c just validate on every push and pull request.
The CI uses the same Nix environment and justfile as local development — there is
no separate CI-specific validation logic.
| Prefix | Use for |
|---|---|
fix/ |
Bug fixes, schema corrections |
feature/ |
New schema elements, types, or features |
chore/ |
Tooling, dependencies, non-schema changes |
ci/ |
CI/CD pipeline changes |
docs/ |
Documentation changes |
This project follows Conventional Commits. Write commit messages in English with a type prefix:
<type>: <short imperative description>
<optional body>
Common types:
| Type | Use for |
|---|---|
feat |
New schema elements, types, or features |
fix |
Bug fixes, schema corrections |
docs |
Documentation changes |
chore |
Tooling, dependencies, maintenance |
ci |
CI/CD changes |
refactor |
Schema restructuring without functional change |
Examples:
feat: add optional emailAdresse element to PersonenstammdatenType
fix: correct minOccurs on geburtsort element
docs: update changelog for v1.1.0
chore: update flake.lock
This project follows Semantic Versioning. The version is tracked in three places:
xsd:schema[@version]attribute instudierendendaten.xsdVersion:line inREADME.md- Git tags (
v1.0.0,v1.1.0, ...)
Per eCH-0018, the namespace URI contains only the major version:
https://schemas.library.ethz.ch/xmlns/studierendendaten/1
The namespace URI changes only on a major version bump (breaking change).
| Change | Version bump | Namespace changes? |
|---|---|---|
Fix typo in xsd:documentation |
Patch | No |
| Add new optional element | Minor | No |
| Add new optional ComplexType | Minor | No |
Relax a constraint (minOccurs="1" → "0") |
Minor | No |
| Remove or rename an element | Major | Yes |
Tighten a constraint (minOccurs="0" → "1") |
Major | Yes |
| Change element order in a sequence | Major | Yes |
All notable changes are recorded in CHANGELOG.md following the
Keep a Changelog format. The changelog is
updated as part of the release preparation — there is no [Unreleased]
section to maintain during regular development.
Releases are created from main. There are no release branches — we tag commits
directly.
-
Prepare the version bump on a
chore/prepare-vX.Y.Zbranch:- Update
version="X.Y.Z"in thexsd:schemaelement ofstudierendendaten.xsd - Update
Version: X.Y.ZinREADME.md - Add a new
[X.Y.Z] - YYYY-MM-DDsection toCHANGELOG.mdwith all changes since the last release (usegit log vLAST..main --onelineto review) - Open a PR, get it reviewed and merged
- Update
-
Tag the merge commit on
main:git checkout main && git pull git tag -a vX.Y.Z -m "vX.Y.Z" git push origin vX.Y.Z
-
GitHub Actions takes over automatically:
- Creates a GitHub release from the tag
- Attaches
studierendendaten.xsdas a release asset - Generates landing pages for all major versions from release data
- Builds the Jekyll site and deploys to GitHub Pages
The namespace URI https://schemas.library.ethz.ch/xmlns/studierendendaten/1
is both an identifier and a resolvable URL. The setup uses a reverse proxy at
ETH that forwards requests to GitHub Pages, so consumers always see the
schemas.library.ethz.ch domain.
Browser / XML tool
→ https://schemas.library.ethz.ch/xmlns/studierendendaten/1/studierendendaten.xsd
→ reverse proxy at ETH (invisible to user)
→ https://eth-library.github.io/schema-studierendendaten/xmlns/studierendendaten/1/studierendendaten.xsd
→ served by GitHub Pages (Jekyll)
The GitHub Pages site is built with Jekyll (minimal theme) from the pages/
directory. Only pages/_config.yml and pages/index.md are checked into the
repo — everything else (release data, per-major-version landing pages, XSD
copies) is generated automatically by the release workflow. New major versions
get their own landing page and XSD without any manual file creation.
The XSD file for each major version is available at:
https://schemas.library.ethz.ch/xmlns/studierendendaten/{major}/studierendendaten.xsd
Specific versions are also available as GitHub release assets.
All changes to the schema must comply with eCH-0018 V2.0 XML Best Practices. Key rules to keep in mind:
- Naming (Chapter 3.2): ComplexTypes use UpperCamelCase with
Typesuffix, SimpleTypes use UpperCamelCase withTypesuffix, elements use lowerCamelCase - Encoding: UTF-8, declared in the XML prolog
- No entity declarations:
<!ENTITYis forbidden - Language markup (Chapter 3.7.2): use element pairs, not
xml:langattributes - Schema location (Chapter 4): namespace URI is an identifier, not a locator