XSD2RDF
A tool to convert XML Schema (XSD) files into various RDF formats (SHACL, OWL, SKOS) with integrated validation capabilities.
Overview
XSD2RDF allows you to convert XML Schema definitions into:
- SHACL (Shapes Constraint Language) for RDF data validation
- OWL (Web Ontology Language) for ontology representation
- SKOS (Simple Knowledge Organization System) for concept schemes and taxonomies
Features
- Convert XSD to SHACL, OWL, and SKOS based on integrated principles
- SHACL shape constraints are linked to SKOS concept schemes when applicable
- Handle complex XSD structures (choices, unions, complex types, enumerations, etc.)
- SHACL shapes are validated according to SHACL-SHACL
This repository also includes a validation script to check RDF data against the generated SHACL shapes and SKOS concepts.
Current usage
This tool is currently used by ERA for the purpose of generating the telematics ontology in preparation to be merged with ERA ontology.
Installation
From PyPI
pip install xsd2rdf
From Source
git clone https://github.com/YourUsername/xsd2rdf.git
cd xsd2rdf
python -m pip install poetry
poetry install
Basic Usage
Convert an XSD file to all RDF formats (SHACL, OWL, SKOS):
python -m xsd2rdf -x path/to/schema.xsd
This generates the following files:
schema.xsd.shape.ttl(SHACL shapes)schema.xsd.owl.ttl(OWL ontology)schema.xsd.*.skos.ttl(SKOS concept schemes, one file per enumeration)
Command Line Parameters
-x, --XSD_FILE: XSD file to be converted-f, --FOLDER: Folder containing non-related XSD files to be converted-o, --OUTPUT_DIR: Output directory for generated files (default: same as XSD file)-a, --ABBREVIATIONS_FILE: File containing custom abbreviations, one per line-d, --debug: Enable debug output-nc, --namespaced-concepts: Use namespaced IRIs for SKOS concepts-un, --use-namespace: Override the XSD targetNamespace for generated SHACL, OWL and SKOS resources-ssv, --skipShaclValidation: Skip SHACL-SHACL validation-pkqi, --property-kind-qualified-iris: AppendDPorOPto every property IRI according to its OWL property kind
Either -x or -f must be specified, but not both. If both are specified, -x takes precedence.
SKOS IRI Options
By default, SKOS concept IRIs are created using a flat structure:
targetnamespace/concepts/conceptschemename_conceptname
With the --namespaced-concepts flag, concepts use a hierarchical structure:
targetnamespace/concepts/conceptschemename/conceptname
Release new version CI/CD
The CI/CD script will automatically push a new version of the library to PyPi when a new Gitlab tag is created. As the tag name, use semantic versioning with 3 digits, examples: v1.2.3.
For user's convenience, best also add human readable release notes.
Examples
With custom output directory:
python -m xsd2rdf -x path/to/schema.xsd -o output/directory
With folder containing multiple unrelated XSD files:
python -m xsd2rdf -f path/to/folder
Using a custom abbreviations file:
python -m xsd2rdf -x path/to/schema.xsd -a path/to/abbreviations.txt
A practical way to generate a list of abbreviations on a Windows machine using Powershell is with this command:
Select-String -Path "c:\Users\mathi\Git\era\xsd2rdf\debug\SFERA_v3.00.xsd" -Pattern "\b[A-Z]{2,}\b" -AllMatches | ForEach-Object { $_.Matches } | ForEach-Object { $_.Value } | Where-Object { $_ -cmatch "^[A-Z]{2,}$" } | Sort-Object -Unique | Where-Object { $_.Length -ge 2 -and $_.Length -le 10 }
Using namespaced concept IRIs:
python -m xsd2rdf -x path/to/schema.xsd --namespaced-concepts
The abbreviations file should contain one abbreviation per line. These abbreviations will be preserved as uppercase when creating human-readable labels from camelCase or PascalCase strings.
Using a custom namespace instead of the XSD targetNamespace:
python -m xsd2rdf -x path/to/schema.xsd --use-namespace http://data.europa.eu/949/
Skipping SHACL-SHACL validation:
python -m xsd2rdf -x path/to/schema.xsd -ssv
Property-kind-qualified IRIs
Use --property-kind-qualified-iris to give every generated property IRI an
explicit suffix based on its OWL property kind:
- datatype properties receive the
DPsuffix; - object properties receive the
OPsuffix.
This is a global opt-in mode. It changes all generated property IRIs, not only IRIs that would otherwise be used as both datatype and object properties. The default mode remains unchanged for backwards compatibility.
For example, consider two complex types that both use an author element in
the same xsd file, but with a different structure. A Book has an author name
(simple string), while an Article references an author as a complete person object:
<xsd:complexType name="Book">
<xsd:sequence>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="author" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Article">
<xsd:sequence>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="author" type="PersonType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="PersonType">
<xsd:sequence>
<xsd:element name="firstName" type="xsd:string"/>
<xsd:element name="lastName" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
With property-kind qualification enabled, their SHACL paths and OWL property IRIs are distinct:
sh:path ex:authorDP .
ex:authorDP a owl:DatatypeProperty .
sh:path ex:authorOP .
ex:authorOP a owl:ObjectProperty .
Enable the mode with:
python -m xsd2rdf \
-x path/to/schema.xsd \
--property-kind-qualified-iris
Development validation
This feature is only available from source as it is meant for development purposes.
Prerequisites:
- Create sample data for validation
schema.xsd.shape.ttlin the same directory as the xsd file
To validate RDF data against SHACL shapes with SKOS concepts:
python shacl-validation.py path/to/schema.xsd
This result will:
- Load the data from
schema.xsd.sample.ttl - Include all related SKOS files (
schema.xsd.*.skos.ttl) - Perform validation using the generated SHACL shapes (
schema.xsd.shape.ttl) - Report results in the command line
Wiki Pages
Some wiki pages explain the inner workings of the convertor and the list of mapping rules implemented within the tool.
License
Metadata
Release files for xsd2rdf 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| xsd2rdf-1.3.0.tar.gz | 28.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xsd2rdf-1.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 56.0 kB
Release files / xsd2rdf-1.3.0.tar.gz
| Download URL | xsd2rdf-1.3.0.tar.gz |
|---|---|
| Size | 28.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6bfbaf3ca18b4d0e5032b827d61c83fa8ec777f33fb6a1e6cd9c09d8541f3785
|
|
BLAKE2b-256 checksum How to use checksums |
d6576392c2b2d0e99cafeeb1f11dca661730487d587b6596b3bb1e5f24300e32
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / xsd2rdf-1.3.0-py3-none-any.whl
| Download URL | xsd2rdf-1.3.0-py3-none-any.whl |
|---|---|
| Size | 28.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1317ed7242916c2c3bd32e47c5fed162fa2d866bce1963fbd5d97c10f77922e2
|
|
BLAKE2b-256 checksum How to use checksums |
dcc55a092eeb407e54ffc3cc021d17094d6f79768f494cf852230dc32288f212
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|