INTERLIS Transformer — Referenz

Vorwort

Die vorliegende Referenz dokumentiert den INTERLIS Transformer vollständig. Sie beschreibt alle CLI-Befehle, die ilimap-DSL, das YAML-Mapping-Format, die Ausdruckssprache, die unterstützten Formate sowie sämtliche Diagnostic-Codes.

Zielgruppe

Die Referenz richtet sich an alle, die mit dem INTERLIS Transformer arbeiten — vom Einsteiger, der das erste Mapping schreibt, bis zur erfahrenen Person, die eine komplexe Transformation mit YAML und verlinkten ilimap-Dateien konfiguriert. Sie setzt Grundkenntnisse in INTERLIS und der Arbeit mit der Kommandozeile voraus.

Aufbau

Konventionen

In dieser Referenz werden folgende typografische Mittel verwendet:

  • feste Breite — CLI-Befehle, Dateinamen, ilimap-Schlüsselwörter, Code

  • kursiv — Platzhalter, die durch eigene Werte zu ersetzen sind

  • [IMPORTANT] — wichtige Hinweise

  • [TIP] — Tipps und Best Practices

  • [WARNING] — Warnungen vor häufigen Fehlern

1. Einführung

1.1. Konzepte

Der INTERLIS Transformer überführt INTERLIS-Daten kontrolliert von einer Form in eine andere. Er trennt bewusst zwischen technischer Repräsentation (Format) und fachlicher Bedeutung (Modell).

1.1.1. Formatumbau und Datenumbau

Formatumbau ändert die technische Repräsentation bei gleichbleibender fachlicher Bedeutung — zum Beispiel XTF nach GeoPackage oder JDBC-Tabelle.

Datenumbau ändert die fachliche Struktur: Klassen, Attribute, Werte, Einheiten oder Beziehungen werden neu abgebildet — zum Beispiel bei der Migration von einem Datenmodell in ein anderes.

1.1.2. Drei Bausteine

  1. I/O-Provider lesen und schreiben Formate wie XTF, ITF, CSV, GeoPackage, JDBC und Shapefile.

  2. IOM / iox-ili stellt die gemeinsame, modellbewusste Objektwelt bereit.

  3. ilimap beschreibt deklarativ, wie aus Quellobjekten Zielobjekte entstehen.

1.1.3. Mapping-Formate

Ein Mapping kann auf zwei Arten beschrieben werden:

  1. Als .ilimap-Datei — eine eigene DSL mit Syntax-Highlighting, Autovervollständigung und Validierung in VS Code.

  2. Als YAML-Datei — geeignet für umfangreiche Transformationen. YAML-Dateien können auf .ilimap-Dateien verweisen, um Regeln auszulagern.

Beide Formate werden vom selben Compiler verarbeitet und sind funktional äquivalent.

1.2. Architektur

Das folgende Diagramm zeigt den Datenfluss vom CLI-Aufruf bis zur Ausgabe:

flowchart LR
    CLI["CLI (picocli)"] --> JR[JobRunner]
    JR --> ML[MappingLoader]
    ML --> MC[MappingCompiler]
    MC --> TE[TransformationEngine]
    TE --> OM[OutputManager]

    ML --> IMS[IliModelService]
    IMS --> TSF[TypeSystemFacade]
    TSF --> ILI[ili2c]

    ML --> IR[IoxReaders]
    TE --> IW[IoxWriters]

    TE --> EE[ExpressionEngine]
    EE --> FR[FunctionRegistry]

    TE --> SS[StateStore]

    subgraph " "
        IR
        IW
    end

Das System arbeitet in zwei Phasen:

  1. Compile-Phase: Der MappingLoader liest die Mapping-Datei (YAML oder .ilimap). Der MappingCompiler validiert sie gegen die INTERLIS-Modelle und erzeugt einen ausführbaren Plan.

  2. Runtime-Phase: Die TransformationEngine führt den Plan aus: Quellobjekte werden gelesen, Ausdrücke evaluiert, Zielobjekte aufgebaut und geschrieben.

1.2.1. Komponenten

Komponente Aufgabe

JobRunner

Einstiegspunkt: lädt das Mapping und orchestriert die Transformation

MappingLoader

Liest YAML- und .ilimap-Dateien, löst modeldir-Referenzen auf

MappingCompiler

Validiert das Mapping gegen die Modelle, erzeugt Diagnosemeldungen

TransformationEngine

Führt die Regeln aus: liest Quellen, evaluiert Ausdrücke, schreibt Ziele

ExpressionEngine

Evaluiert ilimap-Ausdrücke mit lazy Evaluation und Typprüfung

FunctionRegistry

Registriert alle Built-in-Funktionen (String, Math, Enum, Date, Lookup, Geometry)

IliModelService

Fassade für ili2c: kompiliert INTERLIS-Modelle, stellt Typinformationen bereit

IoxReaders / IoxWriters

Lesen und schreiben die unterstützten Formate (XTF, ITF, CSV, GPKG, JDBC, SHP)

StateStore

Hält den Zustand während der Transformation (OID-Registry, Basket-Zuordnung)

1.3. Schnelleinstieg

Dieser Abschnitt zeigt einen minimalen Transformationslauf vom geklonten Repository bis zur Ausgabe.

1.3.1. Voraussetzungen

  • Java 17 oder neuer

  • Git (um das Repository zu klonen)

1.3.2. Build

git clone https://github.com/edigonzales/ilitransformer.git
cd ilitransformer
./gradlew installDist

1.3.3. Erstes Mapping

Die Demo-Suite enthält ein minimales Beispiel (Hello Copy), das zwei Objekte kopiert und dabei Namen trimmt und in Grossbuchstaben umwandelt.

Mapping validieren
./build/install/ilitransformer/bin/ilitransformer validate-mapping \
  -m demo/01-hello-copy/profile.ilimap
Transformation ausführen
./build/install/ilitransformer/bin/ilitransformer transform \
  -m demo/01-hello-copy/profile.ilimap
Transformation mit Validierung der Ausgabe
./build/install/ilitransformer/bin/ilitransformer transform \
  -m demo/01-hello-copy/profile.ilimap --validate

Das Ergebnis (output.xtf) enthält zwei Target-Objekte mit bereinigten Namen.

1.3.4. Nächste Schritte

Die vollständige Demo-Suite (demo/) enthält neun Beispiele, die sich von einfachen Kopierregeln bis zu Referenzen, BAG OF STRUCTURE und OID-Strategien steigern. Siehe Anhang C für die kompletten Listings.

2. CLI-Referenz

2.1. transform

Führt eine Transformation aus: liest Eingabedaten, wendet die Mapping-Regeln an und schreibt die Ausgabedatei.

2.1.1. Signatur

ilitransformer transform -m <path> [options]

2.1.2. Optionen

Option Typ Pflicht Beschreibung

-m, --mapping

file

ja

Pfad zur Mapping-Datei (YAML oder .ilimap)

--modeldir

dir

nein

Zusätzliches Modellverzeichnis (wiederholbar)

--validate

flag

nein

Ausgabe nach der Transformation mit ilivalidator prüfen

--report

dir

nein

Verzeichnis für Reports (JSON + Markdown)

--fail-policy

enum

nein

strict (Default), lenient, report_only

--keep-temp

flag

nein

Temporäre Dateien bei Fehler nicht löschen

2.1.3. Fail-Policy

Wert Verhalten

strict

Abbruch bei jedem Fehler (Default)

lenient

Fehler sammeln, Ausgabe trotzdem schreiben

report_only

Fehler nur reportieren, keine Ausgabe schreiben

2.1.4. Beispiele

Minimale Transformation
ilitransformer transform -m mapping.ilimap
Mit Modellverzeichnissen und Validierung
ilitransformer transform \
  -m profile.ilimap \
  --modeldir models/ \
  --validate
Mit Report und lenient-Policy
ilitransformer transform \
  -m mapping.yml \
  --report reports/ \
  --fail-policy lenient

2.2. validate-mapping

Prüft eine Mapping-Datei auf syntaktische und semantische Korrektheit, ohne eine Transformation auszuführen.

2.2.1. Signatur

ilitransformer validate-mapping -m <path> [options]

2.2.2. Optionen

Option Typ Pflicht Beschreibung

-m, --mapping

file

ja

Pfad zur Mapping-Datei (YAML oder .ilimap)

--modeldir

dir

nein

Zusätzliches Modellverzeichnis (wiederholbar)

2.2.3. Verhalten

Ohne --modeldir: Nur strukturelle Validierung (Syntax, Duplikate, unbekannte Referenzen innerhalb der Mapping-Datei).

Mit --modeldir: Vollständige modellbewusste Validierung. Die referenzierten INTERLIS-Modelle werden kompiliert. Klassen-, Attribut- und Typreferenzen werden gegen die Modelle geprüft.

Für .ilimap-Dateien, die modeldir im job-Block deklarieren, ist --modeldir auf der Kommandozeile optional. Ohne job.modeldir und ohne --modeldir erfolgt nur eine reduzierte Prüfung.

2.2.4. Beispiele

Strukturelle Prüfung
ilitransformer validate-mapping -m minimal.ilimap
Modellbewusste Prüfung
ilitransformer validate-mapping \
  -m profile.ilimap \
  --modeldir /pfad/zu/modellen/

2.2.5. Exit-Codes

Code Bedeutung

0

Keine Fehler

1

Syntaxfehler oder semantische Probleme

2.3. validate-transfer

Validiert eine INTERLIS-Transferdatei (ITF oder XTF) mit ilivalidator.

2.3.1. Signatur

ilitransformer validate-transfer -f <file> --modeldir <dir>... --model <model>... [options]

2.3.2. Optionen

Option Typ Pflicht Beschreibung

-f, --file

file

ja

INTERLIS-Transferdatei (ITF oder XTF)

--modeldir

dir

ja

Modellverzeichnis (wiederholbar)

--model

name

ja

INTERLIS-Modellname (wiederholbar)

--log

file

nein

Pfad für das Validierungs-Log

2.3.3. Beispiel

ilitransformer validate-transfer \
  -f output.xtf \
  --modeldir models/ \
  --model HelloDemo
Mit Log-Datei
ilitransformer validate-transfer \
  -f output.xtf \
  --modeldir models/ \
  --model HelloDemo \
  --log validation.log

2.4. convert-mapping

Konvertiert eine YAML-Mapping-Datei in das .ilimap-Format.

2.4.1. Signatur

ilitransformer convert-mapping --from <yaml> --to <ilimap>

2.4.2. Optionen

Option Typ Pflicht Beschreibung

--from, --input

file

ja

YAML-Mapping-Datei (Quelle)

--to, --output

file

ja

.ilimap-Datei (Ziel)

2.4.3. Beispiel

ilitransformer convert-mapping \
  --from mapping.yml \
  --to mapping.ilimap

Die umgekehrte Richtung (ilimap → YAML) wird nicht unterstützt. Bearbeiten Sie Mappings bevorzugt im .ilimap-Format mit der VS-Code-Erweiterung.

2.5. inspect-model

Exportiert die Struktur eines INTERLIS-Modells als JSON und/oder Markdown. Nützlich, um verfügbare Klassen, Attribute und Typen zu erkunden.

2.5.1. Signatur

ilitransformer inspect-model --model <name> [options]

2.5.2. Optionen

Option Typ Pflicht Beschreibung

--model

name

ja

INTERLIS-Modellname

--modeldir

dir

nein

Modellverzeichnisse (Semikolon-getrennt)

--output

path

nein

Basispfad für die Ausgabe (.json und .md werden angehängt)

--format

enum

nein

json, markdown, both (Default: both)

2.5.3. Beispiele

JSON und Markdown exportieren
ilitransformer inspect-model \
  --model HelloDemo \
  --modeldir models/ \
  --output hello
# Erzeugt: hello.json, hello.md
Nur JSON
ilitransformer inspect-model \
  --model HelloDemo \
  --modeldir models/ \
  --format json

2.6. run-bundle

Führt ein vordefiniertes Transformations-Bundle aus, das in einer Manifest-YAML-Datei beschrieben ist.

2.6.1. Signatur

ilitransformer run-bundle --manifest <yaml> [options]

2.6.2. Optionen

Option Typ Pflicht Beschreibung

--manifest

file

ja

Bundle-Manifest (YAML)

--source

file

nein

Eingabedatei überschreiben

--report-dir

dir

nein

Report-Verzeichnis

--output

file

nein

Ausgabedatei überschreiben

--repo-root

dir

nein

Repository-Wurzel für relative Pfade

--validate

flag

nein

Ausgabe validieren

--no-validate

flag

nein

Validierung deaktivieren

Ohne --validate und --no-validate gilt die Einstellung aus dem Manifest.

2.6.3. Beispiel

ilitransformer run-bundle \
  --manifest profiles/dm01-to-dmav/bundle.yml \
  --repo-root profiles/dm01-to-dmav/ \
  --validate

2.7. Globale Optionen

Diese Optionen sind für alle Befehle verfügbar.

2.7.1. --help

Zeigt die Hilfe für einen Befehl an:

ilitransformer --help                      # Befehlsübersicht
ilitransformer transform --help           # Hilfe für transform
ilitransformer validate-mapping --help    # Hilfe für validate-mapping

2.7.2. --version

Zeigt die Build-Version und den Git-Commit-Hash an:

ilitransformer --version
# ilitransformer 0.1.0 (commit: a1b2c3d)

2.7.3. Exit-Codes

Code Bedeutung

0

Erfolg

1

Kompilierungsfehler oder Laufzeitfehler

2.7.4. Gradle-Tasks

Neben den CLI-Befehlen stehen Gradle-Tasks für spezielle Anwendungsfälle zur Verfügung:

Task Beschreibung

validateTransfer

Transferdatei validieren (-Ptransfer=…​ -Pmodel=…​)

importDmavCorrelation

DM01/DMAV-Korrelation importieren

produceDm01BbItf

DM01-BB-ITF erzeugen

runDm01DmavFullRun

Vollständigen DM01→DMAV-Lauf ausführen

generateExpressionReference

Ausdrucksreferenz generieren

./gradlew validateTransfer -Ptransfer=output.xtf -Pmodel=MyModel

3. ilimap-DSL-Referenz

3.1. Dateistruktur

Eine .ilimap-Datei hat folgenden Aufbau:

mapping v2 ["Profilname"] {
  job { ... }          // 0..1
  input <id> { ... }   // 1..n
  output <id> { ... }  // 1..n
  oid <strategie> { ... }  // 0..1
  basket <strategie>;      // 0..1
  enum <name> { ... }      // 0..n
  defaults { ... }         // 0..1
  rule <id> { ... }        // 1..n
}

3.1.1. Top-Level-Elemente

Element Kardinalität Beschreibung

mapping v2

1

Dateikopf mit optionalem Profilnamen in Anführungszeichen

job

0..1

Metadaten (Name, Beschreibung, modeldir, Fail-Policy)

input

1..n

Eingabedateien mit Format, Modell und Optionen

output

1..n

Ausgabedateien mit Format, Modell und Optionen

oid

0..1

OID-Strategie (preserve, integer, uuid, deterministicUuid)

basket

0..1

Basket-Strategie (preserve, generateUuid, preserveOrGenerateUuid, byTopic)

enum

0..n

Enum-Mapping-Tabellen (benannte Zuordnungen Wert ⇒ Zielwert)

defaults

0..1

Default-Werte für Zielattribute (top-level, gilt für alle Regeln)

rule

1..n

Transformationsregeln

3.1.2. Minimales Beispiel

mapping v2 {
  input src {
    path "input.xtf";
    model "HelloDemo";
  }

  output tgt {
    path "output.xtf";
    model "HelloDemo";
  }

  oid uuid;

  rule copy {
    target tgt class "HelloDemo.Persons.Target";
    source s from src class "HelloDemo.Persons.Source";
    assign {
      Name = s.Name;
    }
  }
}

Die .ilimap-Datei kann mit der VS-Code-Erweiterung ilimap bearbeitet werden, die Syntax-Highlighting, Autovervollständigung, Validierung und eine grafische Mapping-Übersicht bereitstellt.

3.2. job-Block

Der job-Block enthält Metadaten und globale Einstellungen.

3.2.1. Syntax

job {
  name "Mein Mapping";
  description "Beschreibung des Mappings";
  direction dm01_to_dmav;
  failPolicy strict;
  compileMode strict;
  modeldir "https://models.interlis.ch/";
  modeldir "models/";
}

3.2.2. Felder

Feld Typ Pflicht Beschreibung

name

string

nein

Name des Mappings

description

string

nein

Freitext-Beschreibung

direction

identifier

nein

Transformationsrichtung (z.B. dm01_to_dmav)

failPolicy

identifier

nein

strict (Default), lenient, reportOnly

compileMode

identifier

nein

strict (Default), compatible, report

modeldir

string

nein

Modellverzeichnis (URL oder Pfad, wiederholbar)

3.2.3. Fail-Policy

Siehe transform für die Beschreibung der Fail-Policy-Werte.

3.2.4. Compile-Mode

Wert Verhalten

strict

Alle Fehler brechen die Kompilierung ab

compatible

Abwärtskompatible Prüfung, weniger streng

report

Fehler nur reportieren, Kompilierung fortsetzen

3.2.5. modeldir

Modellverzeichnisse werden in der deklarierten Reihenfolge durchsucht. URLs werden vor der Verwendung heruntergeladen und gecacht.

job {
  modeldir "https://models.interlis.ch/";
  modeldir "./lokale-modelle/";
}

3.3. input und output

input und output deklarieren Ein- und Ausgabedateien mit Format, Modell und formatspezifischen Optionen.

3.3.1. Syntax input

input <id> {
  path "datei.xtf";
  model "Model.Topic";
  format xtf;
  option <key> <value>;
  connection { ... }      // nur JDBC
  query <id> { ... }      // nur JDBC, wiederholbar
}

3.3.2. Syntax output

output <id> {
  path "ausgabe.xtf";
  model "Model.Topic";
  format xtf;
  option <key> <value>;
}

3.3.3. Gemeinsame Felder

Feld Typ Pflicht Beschreibung

path

string

ja*

Dateipfad (* ausser bei JDBC)

model

string

ja

INTERLIS-Modellname

format

identifier

nein

itf, xtf, csv, gpkg, jdbc, shp

option

id + literal

nein

Formatspezifische Option (wiederholbar)

Wird kein format angegeben, errät der Transformer das Format anhand der Dateiendung: .xtf → XTF, .itf → ITF, *.xml → XML. Bei CSV, GPKG, JDBC und SHP ist format immer erforderlich.

3.3.4. JDBC-spezifische Blöcke

Siehe Format-Referenz: JDBC für connection und query.

3.3.5. Beispiele

XTF
input src {
  path "daten/input.xtf";
  model "HelloDemo";
}
CSV mit Optionen
input csv_data {
  path "daten/input.csv";
  model "HelloData";
  format csv;
  option separator ";";
  option encoding "ISO-8859-1";
}
Shapefile-Ausgabe mit Optionen
output shp_out {
  path "output/gebaeude.shp";
  model "LV95_Gebaeude";
  format shp;
  option dbfEncoding "UTF-8";
  option fieldNameStrategy truncate;
}

3.4. Formatoptionen

Jedes Format unterstützt spezifische Optionen, die mit option <key> <value> gesetzt werden.

3.4.1. CSV (nur Eingabe)

Option Default Beschreibung

firstLineIsHeader

true

Erste Zeile als Spaltenkopf interpretieren

separator

,

Trennzeichen

delimiter

"

Textbegrenzungszeichen

encoding

UTF-8

Dateikodierung

3.4.2. GeoPackage (nur Eingabe)

Option Default Beschreibung

table

(Pflicht)

Tabellenname

fetchSize

10000

Zeilen pro Fetch-Roundtrip

3.4.3. JDBC (nur Eingabe)

Für JDBC siehe die Blöcke connection und query in Format-Referenz: JDBC.

3.4.4. Shapefile (Eingabe)

Option Default Beschreibung

class

(Pflicht)

Qualifizierter Quellklassenname

topic

aus class

Basket-Topic

basketId

b1

Basket-ID

oidField

shp.<recordNumber>

OID-DBF-Feld

geometryAttribute

inferiert

Geometrieattribut

geometryType

aus Shape-Typ

coord, polyline, surface

dbfEncoding

ISO-8859-1

DBF-Kodierung

column.<DBF>

(opt.)

DBF-Feld → INTERLIS-Attribut

deletedRecordPolicy

error

error oder skip bei gelöschten Records

requireShx

false

.shx-Datei erzwingen

3.4.5. Shapefile (Ausgabe)

Option Default Beschreibung

class

erste geschriebene Klasse

IOX-Klasse

geometryAttribute

inferiert

Geometrieattribut für .shp

shapeType

aus Geometrie

null, point, multipoint, polyline, polygon

dbfEncoding

UTF-8

DBF-Kodierung

fieldNameStrategy

strict

strict, truncate, stable für DBF-Feldnamen

overflowPolicy

strict

strict, truncate bei DBF-Feldüberlauf

writeSidecarMapping

true

.iliattr.json-Mapping-Datei schreiben

prj

(leer)

WKT für .prj-Datei

failOnMultipleBaskets

true

Mehrere Baskets ablehnen

3.5. oid und basket

Steuern, wie Objekt-Identifikatoren (OID) und Baskets im Zielmodell vergeben werden.

3.5.1. oid

// Einfache Form
oid uuid;

// Mit Namespace
oid deterministicUuid {
  namespace "ch.admin.geo";
}

Strategien:

Strategie Beschreibung

preserve

OID aus der Quelle übernehmen

integer

Fortlaufende Ganzzahlen vergeben

uuid

Zufällige UUIDs generieren

deterministicUuid

UUIDs aus OID + Namespace ableiten (reproduzierbar)

external

Reserviert, nicht implementiert

Der deterministicUuid-Namespace ist ein optionaler String. Ist er gesetzt, werden UUIDs aus namespace + Quell-OID abgeleitet, sodass sie über mehrere Läufe hinweg stabil bleiben.

Die Strategie external ist reserviert, aber nicht implementiert. Ihre Verwendung führt zu einem Fehler.

3.5.2. basket

basket preserve;

Strategien:

Strategie Beschreibung

preserve

Basket-IDs aus der Quelle übernehmen

generateUuid

Neue UUID-Baskets generieren

preserveOrGenerateUuid

Quelle übernehmen, sonst UUID generieren

byTopic

Baskets nach Topic gruppieren

expression

Reserviert, nicht implementiert

Die Strategie expression ist reserviert, aber nicht implementiert.

3.6. enum und defaults

3.6.1. enum — Enum-Mapping-Tabellen

enum meine_enum_map {
  #aktiv => #aktiv;
  #inaktiv => #inaktiv;
  #unbekannt => #andere;
  _ => #andere;    // Default-Wert
}

Enum-Blöcke definieren benannte Zuordnungstabellen, die in Ausdrücken mit enumMap(), enumMapDefault() und enumMapStrict() verwendet werden (siehe Ausdruckssprache: Enum-Funktionen).

Element Beschreibung

"literal" ⇒ "literal"

Enum-Wert der Quelle auf Enum-Wert des Ziels abbilden

#literal ⇒ #literal

Hash-Literale für Enum-Werte

_

Wildcard / Default-Zweig

Enum-Maps werden über ihren Bezeichner referenziert — nicht über ihren Dateinamen. Der Bezeichner meine_enum_map wird in Ausdrücken als enumMap(s.Status, meine_enum_map) verwendet.

3.6.2. defaults — Default-Werte

defaults-Blöcke können auf zwei Ebenen erscheinen:

Top-Level (gilt für alle Regeln):

defaults {
  Beschreibung = "Standardtext";
  Status = #aktiv;
}

Rule-Level (gilt nur für diese Regel):

rule copy {
  defaults {
    Beschreibung = "Kopiert von " + s.Name;
  }
  ...
}

Rule-Level-Defaults überschreiben Top-Level-Defaults für dasselbe Attribut. Defaults kommen nur zum Zug, wenn das Zielattribut in keiner assign-Anweisung gesetzt wurde.

3.7. rule-Block

Eine Regel beschreibt, wie aus einer oder mehreren Quellklassen eine Zielklasse befüllt wird.

3.7.1. Syntax

rule <id> {
  target <outputId> class "<Model.Topic.Class>";
  source <alias> from <inputId>[, <inputId>...] class "<Model.Topic.Class>" [where <expr>];

  [where <expression>;]
  [join (inner|left) <alias> to <alias> on <expression>;]
  [identity <alias.attr>, ...;]

  assign {
    <targetAttr> = <expression>;
    ...
  }

  [defaults { ... }]
  [bag <name> { ... }]
  [ref <name> { ... }]
  [create class "..." { ... }]
  [loss { ... }]
  [metadata { ... }]
}

3.7.2. Felder

Feld Typ Pflicht Beschreibung

id

aliasId

ja

Eindeutiger Regelbezeichner (keine Bindestriche)

target

block

ja

Zielklasse mit Output-ID

source

block

ja*

Quellklasse mit Alias und Input-ID (1..n pro Regel)

where

expression

nein

Filterbedingung für Quellobjekte (nur Objekte, die true ergeben)

join

block

nein

Join zwischen zwei Quellen (experimentell, max. 1 pro Regel)

identity

list

nein

Business-Key-Felder (z.B. identity s.Nummer, s.Name;)

assign

block

nein

Attributzuweisungen

defaults

block

nein

Regel-spezifische Defaults

bag

block

nein

BAG OF STRUCTURE (wiederholbar)

ref

block

nein

Referenz-Mapping (wiederholbar)

create

block

nein

Zusätzliche Zielobjekte erzeugen (experimentell)

loss

block

nein

Dokumentierter Informationsverlust (wiederholbar)

metadata

block

nein

Metadaten zur Regel (direction, roundtrip, lossiness)

3.7.3. target

target tgt class "HelloDemo.Persons.Target";
  • tgt — Output-ID, muss als output im Mapping deklariert sein

  • "HelloDemo.Persons.Target" — vollqualifizierter INTERLIS-Klassenname

3.7.4. source

source s from src class "HelloDemo.Persons.Source";
source s from src, other class "Shared.Info" where s.Status == #aktiv;
  • s — Alias (in Ausdrücken als s.Attribut verwendet)

  • from src — Input-ID (eine oder mehrere, kommagetrennt)

  • where — optionale Filterbedingung

Mehrere source-Blöcke in einer Regel erlauben kartesisches Produkt oder — mit join — kontrollierte Verknüpfungen.

3.7.5. Mehrere Quellen pro Regel

Eine Regel kann mehrere source-Blöcke haben:

rule combine {
  target tgt class "Target.Combined";
  source p from src1 class "Source.Person";
  source a from src2 class "Source.Address" where p.AdressId == a.Id;

  assign {
    Name = p.Name;
    Ort = a.Ort;
  }
}

3.8. assign und Ausdrücke

Der assign-Block enthält die eigentlichen Attributzuweisungen.

3.8.1. Syntax

assign {
  <zielAttribut> = <expression>;
  ...
}

Jede Zuweisung besteht aus einem Zielattribut (links) und einem Ausdruck (rechts), abgeschlossen mit ;.

3.8.2. Einfache Zuweisungen

assign {
  Name = s.Name;                          // Direkt übernehmen
  Beschreibung = "Standard";              // Konstanter String
  Anzahl = 42;                            // Konstanter Zahlenwert
  Aktiv = true;                           // Boolescher Wert
  Status = #aktiv;                        // Enum-Wert
}

3.8.3. Ausdrücke mit Funktionen

assign {
  Name = trim(s.Name);                    // String trimmen
  NameGross = upper(trim(s.Name));        // Verschachtelte Aufrufe
  Wert = round(s.Wert, 2);               // Auf 2 Stellen runden
  Datum = toXmlDateTime(s.Datum);        // Typkonvertierung
  StatusNeu = enumMap(s.StatusAlt,      // Enum-Mapping
    meine_map);
  Bezug = if(defined(s.Referenz),         // Bedingung
    s.Referenz, null);
}

3.8.4. Pfade und Aliase

  • alias.attribut — Attribut eines Quellobjekts (z.B. s.Name)

  • alias.rolle.attribut — Attribut über eine Rolle (z.B. s.Adresse.Ort)

Die vollständige Ausdruckssprache ist in Kapitel 5 dokumentiert.

3.8.5. Ausdrücke über mehrere Zeilen

Lange Ausdrücke können umgebrochen werden — der Ausdruck endet erst beim ;:

assign {
  Label = trim(
    upper(s.Name)
  );
}

3.9. bag, ref und create

3.9.1. bag — BAG OF STRUCTURE

bag adressen {
  from a in src class "Source.Adresse" where a.PersonId == p.OID;
  target Adressen;
  structure "Target.Adresse";
  mode embed;
  maxItems 5;
  parentRef attribute "PersonId" parent p;

  assign {
    Strasse = a.Strasse;
    PLZ = a.PLZ;
    Ort = a.Ort;
  }

  bag dokumente {     // verschachtelter Bag
    ...
  }
}
Feld Typ Pflicht Beschreibung

from

block

ja

Quelle für Bag-Einträge (alias, inputId, class, where)

target

identifier

nein

Zielattributname (Default: Bag-Name)

structure

string

ja

Strukturklasse für Bag-Einträge

mode

enum

nein

embed (Default) oder expand

maxItems

number

nein

Maximale Anzahl Einträge

parentRef

block

nein

Rückwärts-Referenz zum Parent (attribute oder role)

where

expression

nein

Zusätzliche Filterbedingung

assign

block

nein

Attributzuweisungen für die Struktur

bag

block

nein

Verschachtelte Bags (rekursiv)

3.9.2. ref — Referenz-Mapping

ref gebaeude_ref {
  association "Target.GebaeudeRef";
  role "Gebaeude";
  required;
  target rule gebaeude_rule sourceRef s.GebaeudeRef;
}
Feld Typ Pflicht Beschreibung

association

string

nein

Qualifizierter Assoziationsname

role

string

nein

Rollenname

required

flag

nein

Referenz ist zwingend

target

block

ja

Ziel: rule <id> sourceRef <expression>

Referenzen werden über den sourceRef-Ausdruck aufgelöst. Der Ausdruck muss auf ein Objekt verweisen, das von der Zielregel (target rule) erzeugt wurde.

3.9.3. create — Zusätzliche Zielobjekte

create class "Target.Metadaten" {
  assign {
    Quelle = "ilitransformer";
    Timestamp = now();
  }
}

create ist experimentell. Es erzeugt zusätzliche Zielobjekte unabhängig von der 1:1-Quellabbildung.

3.10. loss und metadata

3.10.1. loss — Dokumentierter Informationsverlust

loss {
  sourcePath s.AlteGeometrie;
  reasonCode "GEOM_VEREINFACHT";
  description "Die Geometrie wurde für das Zielmodell vereinfacht. " +
              "Detailsiehe Transformationsbericht.";
  when defined(s.AlteGeometrie);
}
Feld Typ Pflicht Beschreibung

sourcePath

expression

ja

Quellattribut, das verloren geht

reasonCode

string

ja

Kategorie/Grund des Verlusts

description

string

ja

Beschreibung des Verlusts (String-Konkatenation mit + möglich)

when

expression

nein

Bedingung, unter der der Verlust eintritt

loss-Blöcke dokumentieren, welche Quelldaten in der Transformation verloren gehen — etwa weil das Zielmodell sie nicht abbilden kann. Sie verhindern keine Transformation, sondern dienen der Nachvollziehbarkeit.

3.10.2. metadata — Regel-Metadaten

metadata {
  direction dm01_to_dmav;
  roundtrip lossy;
  lossiness partial;
}
Feld Typ Beschreibung

direction

identifier

Transformationsrichtung

roundtrip

identifier

Roundtrip-Fähigkeit (z.B. lossless, lossy)

lossiness

identifier

Verlustgrad (z.B. none, partial, full)

Die Werte sind frei wählbare Bezeichner — sie werden nicht validiert, sondern dienen der Dokumentation.

3.11. Lexikalische Regeln

3.11.1. Kommentare

// Zeilenkommentar
/* Block-Kommentar
   über mehrere Zeilen */

3.11.2. Strings

Doppelte Anführungszeichen:

"Ein String mit Umlauten: äöü"
""

3.11.3. Bezeichner

  • symbolId: [a-zA-Z][a-zA-Z0-9_-]* — für Regelnamen, Input-/Output-IDs, Enum-Namen Bindestriche sind erlaubt (z.B. meine-regel)

  • aliasId: [a-zA-Z][a-zA-Z0-9_]* — für Source-Aliase in Ausdrücken Keine Bindestriche (z.B. s, quelle1)

3.11.4. Numerische Literale

42
3.14
-5
0

3.11.5. Boolesche und Null-Literale

true
false
null

3.11.6. Enum-Literale

Mit #-Präfix:

#aktiv
#inaktiv
#unbekannt

3.11.7. Reservierte Wörter

Die folgenden Wörter sind reserviert und können nicht als Bezeichner verwendet werden:

mapping, job, input, output, oid, basket, enum, rule, target, source, from, where, join, identity, assign, defaults, bag, ref, create, loss, metadata, class, inner, left, mode, structure, maxItems, parentRef, association, role, required, sourcePath, reasonCode, description, when, direction, roundtrip, lossiness, option, true, false, null

3.11.8. Ausdruck-Ende

Ein ; auf oberster Verschachtelungsebene beendet einen Ausdruck. ; innerhalb von Strings, Klammern oder Block-Kommentaren werden ignoriert:

assign {
  Name = "Text; mit Semikolon";   // OK: in String
  Wert = if(a == b; b; a);         // NICHT OK: ; in Klammern beendet Ausdruck nicht
}

4. YAML-Mapping-Referenz

4.1. Gesamtstruktur

Eine YAML-Mapping-Datei hat drei Top-Level-Sektionen:

version: 1

job:
  name: "Meine Transformation"
  description: "Beschreibung"
  direction: dm01-to-dmav
  failPolicy: strict
  modeldir:
    - "https://models.interlis.ch/"
    - "models/"
  inputs: [...]
  outputs: [...]

mapping:
  oidStrategy: ...
  basketStrategy: ...
  enums: {...}
  defaults: {...}
  compileMode: strict
  rules: [...]
Feld Typ Pflicht Beschreibung

version

int

ja

DSL-Version (aktuell 1)

job

JobSection

ja

Job-Metadaten und I/O-Deklarationen

mapping

MappingSection

ja

Mapping-Regeln und Strategien

Der YAML-Mapping-Compiler validiert die Version. Nur version: 1 wird derzeit unterstützt.

4.1.1. Vergleich YAML vs. ilimap

Aspekt YAML ilimap

Verwendung

Umfangreiche Transformationen mit vielen Dateien

Einzelne Mapping-Dateien

Tooling

Allgemeine YAML-Editoren

VS-Code-Erweiterung mit LSP

Modularisierung

Verlinkungen auf .ilimap-Dateien

Alles-in-einer-Datei

Syntax-Prüfung

Durch YAML-Parser + Compiler

Durch LSP in Echtzeit

Konvertierung

convert-mapping → ilimap

4.2. JobSection

Die job-Sektion deklariert Metadaten und sämtliche Ein- und Ausgabedateien.

4.2.1. Felder

Feld Typ Pflicht Beschreibung

name

string

nein

Job-Name

description

string

nein

Beschreibung

direction

string

nein

Transformationsrichtung

failPolicy

string

nein

strict (Default), lenient, reportOnly

modeldir

list[string]

nein

Modellverzeichnisse (URLs oder Pfade)

inputs

list[InputSpec]

ja

Eingabedateien (>= 1)

outputs

list[OutputSpec]

ja

Ausgabedateien (>= 1)

4.2.2. Beispiel

job:
  name: "DM01 nach DMAV"
  description: "Vollständige Transformation"
  direction: dm01-to-dmav
  failPolicy: strict
  modeldir:
    - "https://models.interlis.ch/"
    - "./lokale-modelle/"
  inputs:
    - id: dm01
      path: "eingabe.xtf"
      model: "DM01"
  outputs:
    - id: dmav
      path: "ausgabe.xtf"
      model: "DMAV"

4.3. InputSpec

Beschreibt eine Eingabedatei mit Format, Modell und formatspezifischen Details.

4.3.1. Felder

Feld Typ Pflicht Beschreibung

id

string

ja

Eindeutige ID (in Regeln als inputId referenziert)

path

string

ja*

Dateipfad (* ausser bei JDBC)

model

string

ja

INTERLIS-Modellname

format

string

nein

itf, xtf, csv, gpkg, jdbc, shp

options

map

nein

Formatspezifische Optionen

connection

block

nein*

JDBC-Verbindung (* Pflicht für JDBC)

queries

block

nein*

JDBC-Queries (* Pflicht für JDBC)

4.3.2. CSV

inputs:
  - id: csv_data
    path: "daten/input.csv"
    model: "MyModel"
    format: csv
    options:
      firstLineIsHeader: true
      separator: ";"
      delimiter: '"'
      encoding: "UTF-8"

4.3.3. GeoPackage

inputs:
  - id: gpkg_data
    path: "daten/gebaeude.gpkg"
    model: "MyModel"
    format: gpkg
    options:
      table: "gebaeude"
      fetchSize: 5000

4.3.4. JDBC (siehe auch Format-Referenz: JDBC)

inputs:
  - id: db_data
    model: "MyModel"
    format: jdbc
    connection:
      url: "jdbc:postgresql://localhost/mydb"
      driver: "org.postgresql.Driver"
      user: "app"
      password: "secret"
    queries:
      - class: "MyModel.Topic.MyClass"
        sql: "SELECT * FROM my_table"
        topic: "Topic"
        basketId: "b1"
        oidColumn: "t_id"
        columns:
          attr1: "col_a"
          attr2: "col_b"
        geometry:
          geom_attr:
            column: "geom_col"
            type: "surface"
            srid: 2056

4.3.5. Shapefile (Eingabe)

inputs:
  - id: shp_data
    path: "daten/gebaeude.shp"
    model: "MyModel"
    format: shp
    options:
      class: "MyModel.Topic.Gebaeude"
      dbfEncoding: "ISO-8859-1"
      geometryType: "surface"

4.4. OutputSpec

Beschreibt eine Ausgabedatei.

4.4.1. Felder

Feld Typ Pflicht Beschreibung

id

string

ja

Eindeutige ID (in Regeln als outputId referenziert)

path

string

ja

Ausgabedatei

model

string

ja

INTERLIS-Modellname

format

string

nein

itf, xtf, shp

options

map

nein

Formatspezifische Optionen

4.4.2. Beispiele

XTF
outputs:
  - id: out
    path: "output.xtf"
    model: "TargetModel"
    format: xtf
XTF mit Pretty-Print
outputs:
  - id: out
    path: "output.xtf"
    model: "TargetModel"
    format: xtf
    options:
      pretty: true
Shapefile
outputs:
  - id: shp_out
    path: "output/gebaeude.shp"
    model: "TargetModel"
    format: shp
    options:
      dbfEncoding: "UTF-8"
      fieldNameStrategy: "truncate"
      prj: "PROJCS[\"CH1903+ / LV95\",...]"

4.5. MappingSection

Die mapping-Sektion enthält die globalen Strategien und die Transformationsregeln.

4.5.1. Felder

Feld Typ Pflicht Beschreibung

oidStrategy

OidStrategySpec

nein

OID-Strategie

basketStrategy

BasketStrategySpec

nein

Basket-Strategie

enums

map[string, map]

nein

Enum-Mapping-Tabellen

defaults

map[string, string]

nein

Default-Werte (top-level)

compileMode

string

nein

strict (Default), compatible, report

rules

list[RuleSpec]

ja

Transformationsregeln (>= 1)

4.5.2. OID-Strategie

mapping:
  oidStrategy:
    type: uuid
Mit Namespace (deterministicUuid)
mapping:
  oidStrategy:
    type: deterministicUuid
    namespace: "ch.admin.geo"

Unterstützte type-Werte: preserve, integer, uuid, deterministicUuid.

4.5.3. Basket-Strategie

mapping:
  basketStrategy:
    type: generateUuid

Unterstützte type-Werte: preserve, generateUuid, preserveOrGenerateUuid, byTopic.

4.5.4. Enum-Mappings

mapping:
  enums:
    status_map:
      aktiv: aktiv
      inaktiv: inaktiv
      unbekannt: andere

4.5.5. Defaults

mapping:
  defaults:
    Beschreibung: "Standardtext"
    Status: "#aktiv"

4.6. RuleSpec

Eine Regel in der YAML-DSL.

4.6.1. Felder

Feld Typ Pflicht Beschreibung

id

string

ja

Eindeutige Regel-ID

target

TargetSpec

ja

Zielklasse und Output

sources

list[SourceSpec]

ja

Quellklassen (>= 1)

where

string

nein

Filter-Ausdruck (betrifft alle Quellen)

identity

IdentitySpec

nein

Business-Key

assign

map[string, string]

nein

Attributzuweisungen

refs

list[RefMapping]

nein

Referenz-Mappings

bags

map[string, BagSpec]

nein

BAG OF STRUCTURE

joins

list[JoinSpec]

nein

Joins (experimentell, max. 1)

create

list[CreateSpec]

nein

Zusätzliche Zielobjekte (experimentell)

loss

list[LossSpec]

nein

Informationsverlust

metadata

MetadataSpec

nein

Metadaten

defaults

map[string, string]

nein

Regel-Defaults

4.6.2. TargetSpec

target:
  output: out
  class: "TargetModel.Topic.TargetClass"

4.6.3. SourceSpec

sources:
  - input: src
    alias: s
    class: "SourceModel.Topic.SourceClass"
    where: "s.Status == #aktiv"

4.6.4. Beispiel

rules:
  - id: "copy_gebaeude"
    target:
      output: out
      class: "LV95.Gebaeude"
    sources:
      - input: src
        alias: g
        class: "AV.Gebaeude"
    assign:
      Name: "trim(g.Name)"
      Nummer: "g.Nummer"
      Geometrie: "ref g.Geometrie"
    bags:
      adressen:
        from:
          input: src
          alias: a
          class: "AV.Adresse"
          where: "a.GebaeudeId == g.OID"
        target: "Adressen"
        structure: "LV95.Adresse"
        assign:
          Strasse: "a.Strasse"
          Ort: "a.Ort"
    refs:
      - association: "LV95.GebaeudeRef"
        role: "Gebaeude"
        sourceRef: "g.RefOID"
        targetRule: "gebaeude_rule"
    loss:
      - sourcePath: "g.AlteGeometrie"
        reasonCode: "GEOM_VEREINFACHT"
        description: "Geometrie vereinfacht"
        when: "defined(g.AlteGeometrie)"
    metadata:
      direction: "av_to_lv95"
      roundtrip: "lossy"
      lossiness: "minimal"

4.7. BagSpec

bags definieren BAG OF STRUCTURE — strukturierte Listen innerhalb eines Zielobjekts.

4.7.1. Felder

Feld Typ Pflicht Beschreibung

from

BagFromSpec

ja

Quelle für Bag-Einträge

structure

string

ja

Strukturklasse

mode

string

nein

embed (Default) oder expand

maxItems

int

nein

Maximale Anzahl Einträge

parentRef

ParentRefSpec

nein

Rückwärts-Referenz

where

string

nein

Zusätzlicher Filter

assign

map[string, string]

nein

Attributzuweisungen

bag

map[string, BagSpec]

nein

Verschachtelte Bags

4.7.2. BagFromSpec

from:
  input: src          # Input-ID
  alias: a            # Alias
  class: "Model.Topic.SourceClass"
  where: "a.ParentId == p.OID"

4.7.3. ParentRefSpec

parentRef:
  attribute: "GebaeudeId"   # oder role: "..."
  parent: g                 # Parent-Alias

4.7.4. Vollständiges Beispiel

bags:
  adressen:
    from:
      input: src
      alias: a
      class: "AV.Adresse"
      where: "a.GebaeudeId == g.OID"
    structure: "LV95.Adresse"
    mode: embed
    maxItems: 10
    parentRef:
      attribute: "GebaeudeId"
      parent: g
    assign:
      Strasse: "a.Strasse"
      Hausnummer: "a.Hausnummer"
      PLZ: "a.PLZ"
      Ort: "a.Ort"
    bag:
      dokumente:
        from:
          input: src
          alias: d
          class: "AV.Dokument"
          where: "d.AdresseId == a.OID"
        structure: "LV95.Dokument"
        assign:
          Dateiname: "d.Dateiname"
          Typ: "d.Typ"

4.8. RefMapping, CreateSpec, LossSpec, MetadataSpec

4.8.1. RefMapping

refs:
  - association: "TargetModel.Topic.AssocRef"
    role: "ZielRolle"
    sourceRef: "s.RefOID"
    targetRule: "ziel_regel"
Feld Pflicht Beschreibung

association

nein

Qualifizierter Assoziationsname

role

nein

Rollenname

sourceRef

ja

Ausdruck, der die Referenz-OID liefert

targetRule

ja

ID der Zielregel, die das referenzierte Objekt erzeugt

4.8.2. CreateSpec (experimentell)

create:
  - class: "TargetModel.Topic.Metadaten"
    assign:
      Quelle: '"ilitransformer"'
      Timestamp: "now()"

4.8.3. LossSpec

loss:
  - sourcePath: "s.AlteGeometrie"
    reasonCode: "GEOM_VEREINFACHT"
    description: "Geometrie wurde vereinfacht"
    when: "defined(s.AlteGeometrie)"
Feld Pflicht Beschreibung

sourcePath

ja

Quellattribut, das verloren geht

reasonCode

ja

Kategorie des Verlusts

description

ja

Beschreibung

when

nein

Bedingung

4.8.4. MetadataSpec

metadata:
  direction: "dm01_to_dmav"
  roundtrip: "lossy"
  lossiness: "partial"
Feld Pflicht Beschreibung

direction

nein

Transformationsrichtung

roundtrip

nein

Roundtrip-Fähigkeit

lossiness

nein

Verlustgrad

4.8.5. IdentitySpec

identity:
  sourceKey:
    - "s.Nummer"
    - "s.Name"

4.9. YAML mit ilimap verknüpfen

Für umfangreiche Transformationen können YAML-Dateien auf .ilimap-Dateien verweisen, anstatt alle Regeln inline zu definieren. Das ermöglicht eine modulare Struktur:

version: 1

job:
  name: "DM01 nach DMAV"
  description: "Modulare Transformation"
  modeldir:
    - "https://models.interlis.ch/"
  inputs:
    - id: dm01
      path: "eingabe.xtf"
      model: "DM01"
  outputs:
    - id: dmav
      path: "ausgabe.xtf"
      model: "DMAV"

mapping:
  rules: []               # Keine Regeln direkt hier

Die Regeln stehen in separaten .ilimap-Dateien — eine pro Topic oder Klasse:

profiles/dm01-to-dmav/
  mapping.yml             ← YAML-Datei mit job.inputs/outputs
  lfp3.ilimap             ← Regeldatei für LFP3
  bb.ilimap               ← Regeldatei für BB
  eo.ilimap               ← Regeldatei für EO
  gs.ilimap               ← Regeldatei für GS
  ...

4.9.1. Wie die Verlinkung funktioniert

Jede .ilimap-Datei deklariert ihre eigenen input und output mit denselben IDs wie die YAML-Datei:

YAML-Datei
job:
  inputs:
    - id: dm01
      path: "eingabe.xtf"
      model: "DM01"
  outputs:
    - id: dmav
      path: "ausgabe.xtf"
      model: "DMAV"
ilimap-Regeldatei
mapping v2 {
  input dm01 {
    path "eingabe.xtf";
    model "DM01";
  }

  output dmav {
    path "ausgabe.xtf";
    model "DMAV";
  }

  rule lfp3 {
    target dmav class "DMAV.LFP3";
    source s from dm01 class "DM01.LFP3";
    ...
  }
}

4.9.2. Ausführung

Die Transformation wird über die YAML-Datei gestartet. Der Transformer lädt die .ilimap-Dateien aus den in modeldir deklarierten Verzeichnissen:

ilitransformer transform -m profiles/dm01-to-dmav/mapping.yml

Die .ilimap-Dateien profitieren von der VS-Code-Erweiterung mit Syntax-Highlighting, Autovervollständigung und Validierung, während die YAML-Datei als schlanker Orchestrator dient.

5. Ausdruckssprache-Referenz

5.1. Werttypen

Die Ausdruckssprache arbeitet mit einem strengen Typsystem. Jeder Ausdruck evaluiert zu genau einem der folgenden Typen:

Typ Beschreibung Beispiel-Literal

TextValue

Zeichenkette

"Hallo"

NumberValue

Numerischer Wert (Ganzzahl oder Fliesskomma)

42, 3.14

BooleanValue

Boolescher Wert

true, false

DateValue

INTERLIS-Datum

Ergebnis von toDate()

XmlDateTimeValue

INTERLIS XML-DateTime

Ergebnis von toXmlDateTime() oder now()

EnumValue

INTERLIS-Enumeration

#aktiv

CoordValue

INTERLIS-Koordinate

Ergebnis von pointOnSurface()

GeometryObjectValue

INTERLIS-Geometrieobjekt

Quellgeometrie

ReferenceValue

INTERLIS-Referenz

Ergebnis von ref-Ausdrücken

NullValue

Null / nicht gesetzt

null

5.1.1. null-Behandlung

null verhält sich "ansteckend": Die meisten Funktionen geben null zurück, wenn ein Argument null ist. Ausnahmen:

  • coalesce(a, b, …​) — ignoriert null-Argumente

  • defined(x) / notDefined(x) — prüfen explizit auf null

  • default(x, fallback) — gibt fallback zurück, wenn x null ist

5.1.2. Typkonvertierung

Die Engine führt keine impliziten Konvertierungen durch. Explizite Konvertierungsfunktionen:

  • toNumber(text) — String → Number

  • toXmlDateTime(value) — Date/Text → XMLDateTime

  • toDate(value) — XMLDateTime/Text → Date

  • toInterlis1Date(value) — Date/XMLDateTime → Text (BASIC_ISO_DATE)

  • enumName(value) — Enum → Text

5.2. Grundfunktionen und Operatoren

5.2.1. Grundfunktionen

Funktion Signatur Beschreibung

coalesce

(a, b, …​) → any

Erstes nicht-null-Argument (variadisch, lazy)

defined

(value) → boolean

true wenn Wert nicht null

notDefined

(value) → boolean

true wenn Wert null (Alias: isNull)

default

(value, fallback) → any

fallback wenn value null ist

if

(cond, ifTrue, ifFalse) → any

Bedingte Auswertung (lazy: nur der gewählte Zweig wird evaluiert)

5.2.2. Vergleichsoperatoren

Die Operatoren werden zu den entsprechenden Funktionen desugared:

Operator Desugaring Bedeutung

a == b

eq(a, b)

Gleichheit

a == null

notDefined(a)

Spezialfall: null-Prüfung

a != b

neq(a, b)

Ungleichheit

a != null

defined(a)

Spezialfall: nicht-null-Prüfung

a < b

lt(a, b)

Kleiner als

a ⇐ b

lte(a, b)

Kleiner oder gleich

a > b

gt(a, b)

Grösser als

a >= b

gte(a, b)

Grösser oder gleich

5.2.3. Logische Operatoren

Operator Desugaring Bedeutung

a and b

if(a, b, false)

Logisches UND (lazy)

a or b

if(a, true, b)

Logisches ODER (lazy)

not a

not(a)

Logisches NICHT

5.2.4. Beispiele

assign {
  // coalesce: erstes nicht-null
  Name = coalesce(s.Name1, s.Name2, "Unbekannt");

  // defined / default
  Optional = default(s.Optional, "Kein Wert");

  // Bedingung
  Status = if(s.Aktiv == true, #aktiv, #inaktiv);

  // Logische Verknüpfung
  Gueltig = defined(s.Name) and defined(s.Geometrie);

  // Vergleich
  Gross = s.Anzahl > 100;
}

5.3. String-Funktionen

Funktion Signatur Beschreibung

concat

(a, b, …​) → text

Strings verketten (variadisch)

substring

(value, start, length) → text

Teilstring extrahieren (1-basiert)

trim

(value) → text

Whitespace an beiden Enden entfernen

upper

(value) → text

In Grossbuchstaben umwandeln

lower

(value) → text

In Kleinbuchstaben umwandeln

replace

(value, pattern, replacement) → text

pattern durch replacement ersetzen

truncate

(value, maxLength) → text

Auf maximale Länge kürzen

5.3.1. Beispiele

assign {
  // Trimmen und Grossschreibung
  Name = upper(trim(s.Rohname));

  // Substring: erstes Zeichen
  Initial = substring(s.Name, 1, 1);

  // Ersetzung
  Bereinigt = replace(s.Text, "  ", " ");

  // Kürzen auf 60 Zeichen
  Kurz = truncate(s.Langtext, 60);

  // Verkettung
  FullName = concat(s.Vorname, " ", s.Nachname);
}

5.4. Math-Funktionen

Funktion Signatur Beschreibung

div

(value, divisor) → number

Division; null bei Division durch 0

mul

(value, factor) → number

Multiplikation

add

(value, addend) → number

Addition

sub

(value, subtrahend) → number

Subtraktion

round

(value, scale) → number

Runden auf Dezimalstellen (HALF_UP)

abs

(value) → number

Absolutwert

min

(a, b) → number

Kleinerer von zwei Werten

max

(a, b) → number

Grösserer von zwei Werten

toNumber

(value) → number

Text in Zahl umwandeln

5.4.1. Beispiele

assign {
  // Einheiten umrechnen
  FlaecheM2 = round(mul(s.FlaecheHa, 10000), 2);

  // Prozentuale Anpassung
  PreisNeu = round(mul(s.PreisAlt, 1.08), 2);

  // Begrenzung
  Anzahl = min(s.Anzahl, 9999);

  // Text → Zahl
  Wert = toNumber(s.TextWert);
}

5.5. Date-Funktionen

Funktion Signatur Beschreibung

toXmlDateTime

(value) → XMLDateTime

DATE oder TEXT in INTERLIS.XMLDateTime umwandeln

toDate

(value) → Date

XMLDateTime oder TEXT in INTERLIS.Date umwandeln

toInterlis1Date

(value) → text

In INTERLIS-1-Datumsformat umwandeln (BASIC_ISO_DATE: YYYY-MM-DD)

now

() → XMLDateTime

Aktueller Zeitstempel (nicht-deterministisch)

now() ist nicht-deterministisch. Jeder Aufruf liefert einen anderen Zeitstempel. Verwenden Sie now() sparsam und nur, wenn der exakte Zeitpunkt der Transformation festgehalten werden soll.

5.5.1. Beispiele

assign {
  // DATE → XMLDateTime
  Erfassung = toXmlDateTime(s.Erfassungsdatum);

  // XMLDateTime → INTERLIS 1 (YYYY-MM-DD)
  DatumAlt = toInterlis1Date(s.ModernesDatum);

  // Aktueller Zeitstempel
  ImportZeit = now();
}

5.6. Enum-Funktionen

Funktion Signatur Beschreibung

enumMap

(value, mapName) → enum

Wert über benannte Enum-Map abbilden; WARNING bei fehlendem Eintrag

enumMapDefault

(value, mapName, fallback) → enum

Wie enumMap, aber mit explizitem Fallback

enumMapStrict

(value, mapName) → enum

Wie enumMap, aber ERROR bei fehlendem Eintrag

enumDefault

(value, fallback) → enum

Fallback-Wert wenn value null ist

enumName

(value) → text

Text-Name eines Enum-Werts

5.6.1. Beispiele

// enum-Block im Mapping:
enum status_map {
  #aktiv => #aktiv;
  #inaktiv => #inaktiv;
  _ => #unbekannt;
}

assign {
  // Standard-Mapping
  StatusNeu = enumMap(s.StatusAlt, status_map);

  // Mit Fallback
  StatusNeu = enumMapDefault(s.StatusAlt, status_map, #unbekannt);

  // Strikt (Fehler bei unbekanntem Wert)
  StatusNeu = enumMapStrict(s.StatusAlt, status_map);

  // Optional mit Default
  Status = enumDefault(s.Status, #aktiv);

  // Enum-Name als Text
  StatusText = enumName(s.Status);
}

5.7. Referenz-Funktionen

Funktion Signatur Beschreibung

refOid

(ref) → text

OID eines Referenz-Objekts extrahieren

refEquals

(a, b) → boolean

Prüfen, ob zwei Referenzen auf dasselbe Objekt zeigen

5.7.1. Beispiele

assign {
  // OID aus Referenz extrahieren
  RefId = refOid(s.GebaeudeRef);

  // Referenzen vergleichen
  GleichesObjekt = refEquals(s.Ref1, s.Ref2);
}

5.8. Lookup-Funktionen

Lookup-Funktionen suchen Werte in anderen Quellklassen — auch input-übergreifend.

Funktion Signatur Beschreibung

oid

(alias) → text

OID des Quellobjekts

bagFirst

(alias, bagAttr, valueAttr) → any

Erstes Attribut aus einem BAG-Attribut

lookup

(classPath, keyAttr, keyValue, returnAttr) → text

Unscoped Lookup über alle Inputs; WARNING bei keinem Treffer

lookupOptional

(classPath, keyAttr, keyValue, returnAttr) → text

Wie lookup, aber still bei keinem Treffer

lookupIn

(inputId, classPath, keyAttr, keyValue, returnAttr) → text

Scoped Lookup (nur in inputId)

existsIn

(inputId, classPath, keyAttr, keyValue, …​) → boolean

Existenz-Prüfung mit mehreren Key/Value-Paaren

5.8.1. Beispiele

assign {
  // OID des Quellobjekts
  SourceOid = oid(s);

  // Erstes Element aus einem Bag
  ErsteAdresse = bagFirst(g, Adressen, Strasse);

  // Lookup über alle Inputs
  Ort = lookup("AV.Ortschaft", "PLZ", s.PLZ, "Ortsname");

  // Leiser Lookup (keine Warnung)
  Ort = lookupOptional("AV.Ortschaft", "PLZ", s.PLZ, "Ortsname");

  // Lookup in bestimmtem Input
  Region = lookupIn(src, "AV.Region", "BFS_Nr", s.BFS, "Name");

  // Existenz-Prüfung
  HatAdresse = existsIn(src, "AV.Adresse", "GebaeudeId", oid(g));
}

5.9. Geometry-Funktionen

Funktion Signatur Beschreibung

coordEquals

(coord1, coord2, tolerance) → boolean

Zwei Koordinaten innerhalb einer Toleranz gleich?

pointOnSurface

(surface) → coord

Deterministischer Punkt auf einer SURFACE/MULTISURFACE

pointOnSurface() gibt eine WARNING aus, wenn kein Punkt abgeleitet werden kann. Dies tritt bei degenerierten Geometrien auf (z.B. Fläche mit Fläche = 0).

5.9.1. Beispiele

assign {
  // Koordinatenvergleich mit Toleranz
  GleicherPunkt = coordEquals(s.Koord1, s.Koord2, 0.001);

  // Label-Punkt aus Fläche
  LabelPunkt = pointOnSurface(s.Geometrie);
}

5.10. Präzedenz und Desugaring

5.10.1. Operatoren-Präzedenz

Von niedrigster zu höchster Bindungsstärke:

Stufe Operatoren Assoziativität

1 (niedrigste)

or

links

2

and

links

3

==, !=

links

4

<, <=, >, >=

links

5

not

rechts

6 (höchste)

(), Literale, Pfade, Funktionsaufrufe

5.10.2. Beispiele zur Präzedenz

// a and b or c                    → (a and b) or c
// a and not b                     → a and (not b)
// a == b and c > d               → (a == b) and (c > d)
// not a and b                     → (not a) and b

5.10.3. Vollständiges Desugaring

Jeder Operator wird vor der Ausführung in einen Funktionsaufruf umgewandelt:

Ausdruck Desugaring

a == b

eq(a, b) — ausser a == nullnotDefined(a)

a != b

neq(a, b) — ausser a != nulldefined(a)

a < b

lt(a, b)

a ⇐ b

lte(a, b)

a > b

gt(a, b)

a >= b

gte(a, b)

a and b

if(a, b, false)

a or b

if(a, true, b)

not a

not(a)

Die Lazy-Evaluation von and und or bedeutet, dass der rechte Operand nur ausgewertet wird, wenn der linke nicht bereits das Ergebnis bestimmt. defined(x) and x > 0 ist daher sicher — x > 0 wird nie mit null evaluiert.

6. Format-Referenz

6.1. XTF und ITF

XTF (XML Transfer Format) und ITF (INTERLIS Transfer Format) sind die primären INTERLIS-Austauschformate.

6.1.1. XTF

Eigenschaft Unterstützung

Eingabe

Vollständig

Ausgabe

Vollständig

Geometrien

Alle INTERLIS-Geometrietypen

Structures

Ja

References

Ja (bidirektionale Auflösung)

6.1.2. ITF

Eigenschaft Unterstützung

Eingabe

Vollständig

Ausgabe

Vollständig

Geometrien

Eingeschränkt (modellabhängig)

Structures

Modellabhängig

References

Modellabhängig

6.1.3. Verwendung

input src {
  path "daten/input.xtf";
  model "MyModel";
  // format xtf;  ← optional, wird aus Endung erraten
}

output tgt {
  path "daten/output.xtf";
  model "MyModel";
  format xtf;
  option pretty true;
}

Bei XTF/ITF wird das Format aus der Dateiendung erraten. Die explizite Angabe von format ist nur nötig, wenn die Endung nicht dem Format entspricht.

6.2. CSV

CSV wird nur als Eingabeformat unterstützt. Jede Zeile entspricht einem Objekt, jede Spalte einem Attribut.

Eigenschaft Unterstützung

Eingabe

Ja

Ausgabe

Nein

Geometrien

Nein

Structures

Nein

References

Nein

6.2.1. Optionen

Siehe ilimap-DSL: Formatoptionen für die vollständige Liste der CSV-Optionen.

6.2.2. Beispiel

input csv_src {
  path "daten/gebaeude.csv";
  model "MyModel";
  format csv;
  option separator ";";
  option firstLineIsHeader true;
  option encoding "UTF-8";
}

Ohne firstLineIsHeader: true werden die Spalten der Reihe nach den Modellattributen zugewiesen. Mit Header werden die Spalten über den Spaltennamen gematcht.

6.3. GeoPackage

GeoPackage wird nur als Eingabeformat unterstützt. Geometrien werden als Simple Features gelesen.

Eigenschaft Unterstützung

Eingabe

Ja

Ausgabe

Nein

Geometrien

Simple Features (Point, LineString, Polygon, Multi*)

Structures

Nein

References

Nein

6.3.1. Optionen

Option Default Beschreibung

table

(Pflicht)

Tabellenname

fetchSize

10000

Zeilen pro JDBC-Fetch-Roundtrip

6.3.2. Beispiel

input gpkg_src {
  path "daten/gebaeude.gpkg";
  model "MyModel";
  format gpkg;
  option table "gebaeude";
}

Nur Simple-Features-Geometrien werden unterstützt. INTERLIS-Structures und -References werden nicht aus GeoPackage gelesen.

6.4. JDBC

JDBC wird nur als Eingabeformat unterstützt. Es erlaubt das Lesen aus beliebigen relationalen Datenbanken.

Eigenschaft Unterstützung

Eingabe

Ja

Ausgabe

Nein

Geometrien

POINT über WKT/WKB; SURFACE über WKT

Structures

Nein

References

Nein

6.4.1. connection-Block

connection {
  driver "org.postgresql.Driver";
  url "jdbc:postgresql://localhost/mydb";
  user "app";
  password "secret";        // Klartext
  userEnv "DB_USER";       // Umgebungsvariable
  passwordEnv "DB_PASS";   // Umgebungsvariable
  property "key" "value";
}

user/password speichern Credentials im Klartext. userEnv/passwordEnv sind sicherer — sie lesen aus Umgebungsvariablen.

6.4.2. query-Block

query gebauede_query {
  topic "Gebaeude";
  class "MyModel.Topic.Gebaeude";
  basketId "b1";
  oidColumn "t_id";
  sql "SELECT t_id, name, nummer, geom FROM gebaeude";
  column "t_id" "OID";
  column "name" "Name";
  column "nummer" "Nummer";
  geometry geom_attr {
    column "geom";
    encoding wkb;
    type surface;
    srid 2056;
  }
}

6.4.3. query-Felder

Feld Typ Pflicht Beschreibung

class

string

ja

INTERLIS-Klassenname

sql

string

ja

SQL-Query

topic

string

nein

Basket-Topic

basketId

string

nein

Basket-ID

oidColumn

string

nein

Spalte für OID

column

block

nein

DB-Spalte → INTERLIS-Attribut (wiederholbar)

geometry

block

nein

Geometrie-Spalte

6.4.4. geometry-Block

Feld Typ Beschreibung

column

string

Geometrie-Spalte

encoding

enum

wkt oder wkb

type

enum

coord, polyline, surface

srid

int

SRID (z.B. 2056 für LV95)

6.5. Shapefile

Shapefile wird als Ein- und Ausgabeformat unterstützt. Es besteht aus mindestens drei Dateien: .shp (Geometrie), .dbf (Attribute) und .shx (Index).

Eigenschaft Unterstützung

Eingabe

Ja

Ausgabe

Ja

Geometrien

Point, MultiPoint, Polyline, Polygon (2D)

Structures

Nein

References

Nein

6.5.1. Eingabe-Optionen

Option Default Beschreibung

class

(Pflicht)

INTERLIS-Klassenname

topic

aus class

Basket-Topic

basketId

b1

Basket-ID

oidField

shp.<recordNumber>

DBF-Feld für OID

geometryAttribute

inferiert

Name des Geometrieattributs

geometryType

aus Shape-Typ

coord, polyline, surface

dbfEncoding

ISO-8859-1

DBF-Kodierung

column.<DBF>

(opt.)

DBF-Spalte → INTERLIS-Attribut

deletedRecordPolicy

error

error oder skip

requireShx

false

.shx erzwingen

6.5.2. Ausgabe-Optionen

Option Default Beschreibung

class

erste geschriebene

IOX-Klasse

geometryAttribute

inferiert

Geometrieattribut für .shp

shapeType

aus Geometrie

null, point, multipoint, polyline, polygon

dbfEncoding

UTF-8

DBF-Kodierung

fieldNameStrategy

strict

strict, truncate, stable

overflowPolicy

strict

strict, truncate

writeSidecarMapping

true

.iliattr.json schreiben

prj

(leer)

WKT-String für .prj

failOnMultipleBaskets

true

Fehler bei mehreren Baskets

DBF-Feldnamen sind auf 10 Zeichen begrenzt. fieldNameStrategy: truncate kürzt lange Attributnamen. Ein Mapping-File (.iliattr.json) dokumentiert die Zuordnung von DBF-Spalten zu INTERLIS-Attributen und wird standardmässig mitgeschrieben.

6.5.3. Eingabe-Beispiel

input shp_src {
  path "daten/gebaeude.shp";
  model "AV";
  format shp;
  option class "AV.Gebaeude";
  option dbfEncoding "ISO-8859-1";
  option geometryType surface;
}

6.5.4. Ausgabe-Beispiel

output shp_out {
  path "output/gebaeude.shp";
  model "LV95";
  format shp;
  option dbfEncoding "UTF-8";
  option fieldNameStrategy truncate;
  option prj "PROJCS[\"CH1903+ / LV95\",GEOGCS[...]]";
}

6.6. Unterstützungsmatrix

Format Eingabe Ausgabe Geometrien Structures References

XTF

Alle

ITF

Eingeschränkt

Modellabhängig

Modellabhängig

XML

Eingeschränkt

Modellabhängig

Modellabhängig

CSV

GeoPackage

Simple Features

JDBC

WKT/WKB POINT

Shapefile

Point/MultiPoint/Polyline/Polygon (2D)

6.6.1. Format-Erkennung

Dateiendung / Option Erkannt als

.xtf

XTF

.itf

ITF

.xml

XML

format csv

CSV (zwingend)

format gpkg

GeoPackage (zwingend)

format jdbc

JDBC (zwingend, kein path)

format shp

Shapefile (zwingend)

6.6.2. Formate im YAML-Mapping

inputs:
  - id: xtf_in
    path: "input.xtf"
    model: "MyModel"
    format: xtf

  - id: csv_in
    path: "input.csv"
    model: "MyModel"
    format: csv
    options:
      separator: ";"

  - id: jdbc_in
    model: "MyModel"
    format: jdbc
    connection:
      url: "jdbc:postgresql://localhost/db"
      userEnv: "DB_USER"
      passwordEnv: "DB_PASS"
    queries:
      - class: "MyModel.Topic.MyClass"
        sql: "SELECT * FROM my_table"

Appendix A: Diagnostic-Codes

Jede Diagnosemeldung hat einen Code der Form ILITRF-KATEGORIE-NAME. Die Codes sind hierarchisch nach Kategorie gruppiert.

ILITRF-MAP — Mapping/Compiler

Code Severity Beschreibung

VERSION

ERROR

version-Feld fehlt oder < 1

MISSING-ID

ERROR

Regel ohne id

DUPLICATE-ID

ERROR

Regel-id nicht eindeutig

MISSING-TARGET-CLASS

ERROR

Zielklasse fehlt

UNKNOWN-OUTPUT

ERROR

Output-ID unbekannt

MISSING-SOURCE-CLASS

ERROR

Quellklasse fehlt

MISSING-ALIAS

ERROR

Source-Alias fehlt

DUPLICATE-ALIAS

ERROR

Source-Alias nicht eindeutig

UNKNOWN-INPUT

ERROR

Input-ID unbekannt

MISSING-INPUT

ERROR

Source-Input-Feld fehlt

UNKNOWN-TARGET-CLASS

ERROR

Zielklasse nicht im Modell

UNKNOWN-SOURCE-CLASS

ERROR

Quellklasse nicht im Modell

ABSTRACT-TARGET-CLASS

ERROR

Zielklasse ist abstrakt

UNKNOWN-TARGET-ATTRIBUTE

ERROR

Zielattribut nicht im Modell

UNKNOWN-SOURCE-ATTRIBUTE

WARNING

Quellattribut nicht im Modell

UNKNOWN-ROLE

WARNING

Rolle nicht in Zielklasse

TYPE-MISMATCH

WARNING

Typ des Ausdrucks passt nicht

MANDATORY-MISSING

WARNING

Pflichtattribut nicht gesetzt

DUPLICATE-TARGET-ASSIGN

ERROR

Zielattribut doppelt zugewiesen

CYCLIC-DEPENDENCY

ERROR

Zyklische Regel-Abhängigkeit

NON-TRANSFERABLE-TARGET

WARNING

Zielklasse ist View

OID-TYPE-MISMATCH

ERROR

OID-Strategie inkompatibel

ILITRF-MODEL — Modell

Code Severity Beschreibung

COMPILE-FAILED

ERROR

Modellkompilierung fehlgeschlagen

ILITRF-RUN — Laufzeit

Code Severity Beschreibung

REF-UNRESOLVED

WARNING / ERROR

Referenz nicht auflösbar

REF-AMBIGUOUS

ERROR

Referenz mehrdeutig

REF-TYPE-MISMATCH

WARNING / ERROR

Falsche Zielklasse

REF-MISSING-MANDATORY

WARNING / ERROR

Pflicht-Referenz fehlt

REF-CARDINALITY

WARNING

Kardinalität verletzt

OID-COLLISION

ERROR

OID-Kollision

BASKET

ERROR

Basket-Zuordnung fehlgeschlagen

SOURCE-READ

ERROR

Quelle nicht lesbar

TARGET-WRITE

ERROR

Ziel nicht schreibbar

EXPR

ERROR

Ausdrucks-Evaluierung fehlgeschlagen

CARDINALITY

ERROR

Kardinalität verletzt

ILITRF-EXPR — Ausdrücke

Code Severity Beschreibung

SYNTAX

ERROR

Syntaxfehler im Ausdruck

UNKNOWN-FUNC

ERROR

Unbekannte Funktion

TYPE

ERROR

Typfehler

NON-DETERMINISTIC

WARNING

Nicht-deterministische Funktion verwendet

UNSUPPORTED

WARNING

Feature noch nicht unterstützt

ILITRF-GEOM — Geometrie

Code Severity Beschreibung

TYPE-MISMATCH

ERROR

Geometrietyp passt nicht

CRS-MISMATCH

ERROR

CRS-Unterschied

INVALID

ERROR

Ungültige Geometrie

TOPOLOGY

WARNING

Topologie-Verletzung

LINEATTR-UNSUPPORTED

WARNING

LINEATTR nicht unterstützt

ILITRF-DMAV — DM01/DMAV-spezifisch

Code Severity Beschreibung

CORRELATION-PARSE

WARNING

XLSX-Korrelationsdatei fehlerhaft

LOW-CONFIDENCE

WARNING

Mapping mit niedriger Konfidenz

LOSSY

WARNING

Verlustbehaftetes Mapping

OPEN-QUESTION

WARNING

Fachlich offene Frage

Appendix B: OID- und Basket-Strategien

OID-Strategien

Strategie Verhalten Namespace

preserve

OID unverändert aus der Quelle übernehmen

integer

Fortlaufende Ganzzahlen (1, 2, 3, …​)

uuid

Zufällige UUIDv4 generieren

deterministicUuid

UUIDv5 aus Namespace + Quell-OID ableiten

Pflicht

external

Reserviert, nicht implementiert

deterministicUuid im Detail

deterministicUuid verwendet UUIDv5 (SHA-1-basiert) mit einem konfigurierbaren Namespace. Die resultierende UUID ist nur vom Namespace und der Quell-OID abhängig — sie bleibt über mehrere Transformationsläufe hinweg stabil.

oid deterministicUuid {
  namespace "ch.admin.geo";
}

Ändern Sie den Namespace nicht nach der ersten Transformation. Ein neuer Namespace erzeugt andere UUIDs und bricht bestehende Referenzen.

Basket-Strategien

Strategie Verhalten

preserve

Basket-ID unverändert aus der Quelle übernehmen

generateUuid

Für jedes Zielobjekt einen neuen UUID-Basket generieren

preserveOrGenerateUuid

Quelle übernehmen wenn vorhanden, sonst UUID generieren

byTopic

Objekte nach INTERLIS-Topic in separate Baskets gruppieren

expression

Reserviert, nicht implementiert

Matrix: Strategie pro Anwendungsfall

Anwendungsfall Empfohlene OID Empfohlener Basket Begründung

1:1-Kopie

preserve

preserve

Identität erhalten

Neue Objekte

uuid

preserveOrGenerateUuid

Eindeutigkeit + Herkunft

Wiederholbare Migration

deterministicUuid

preserveOrGenerateUuid

Reproduzierbarkeit

Modell-Merge

uuid

byTopic

Trennung nach Thema

Appendix C: Beispiele

Dieser Anhang enthält vollständige, lauffähige Minimalbeispiele. Alle Beispiele sind im Repository unter demo/ verfügbar.

Demo 01 — Hello Copy (ilimap)

Interlis-Modell (models/hello.ili)
INTERLIS 2.4;

MODEL HelloDemo (en)
  AT "https://demo.ilinexus.ch" VERSION "2026-06-22" =
  TOPIC Persons =
    BASKET OID AS INTERLIS.UUIDOID;
    OID AS INTERLIS.UUIDOID;

    CLASS Source =
      Name: MANDATORY TEXT*60;
      Anzahl: 0 .. 9999;
      Aktiv: BOOLEAN;
    END Source;

    CLASS Target =
      Label: MANDATORY TEXT*60;
      LabelGross: TEXT*60;
      Anzahl: 0 .. 9999;
      Aktiv: BOOLEAN;
    END Target;

  END Persons;
END HelloDemo.
Eingabedaten (data/input.xtf)
<?xml version="1.0" encoding="UTF-8"?>
<ili:transfer xmlns:ili="http://www.interlis.ch/xtf/2.4/INTERLIS"
              xmlns:HelloDemo="http://www.interlis.ch/xtf/2.4/HelloDemo">
  <ili:headersection>
    <ili:models>
      <ili:model>HelloDemo</ili:model>
    </ili:models>
    <ili:sender>demo</ili:sender>
  </ili:headersection>
  <ili:datasection>
    <HelloDemo:Persons ili:bid="b1">
      <HelloDemo:Source ili:tid="001">
        <HelloDemo:Name>  Alice Mueller  </HelloDemo:Name>
        <HelloDemo:Anzahl>42</HelloDemo:Anzahl>
        <HelloDemo:Aktiv>true</HelloDemo:Aktiv>
      </HelloDemo:Source>
    </HelloDemo:Persons>
  </ili:datasection>
</ili:transfer>
Mapping (profile.ilimap)
mapping v2 "demo-01-hello-copy" {
  job {
    description "1:1-Kopie mit String-Expressions";
    modeldir "models/";
  }

  input src {
    path "data/input.xtf";
    model "HelloDemo";
  }

  output tgt {
    path "output.xtf";
    model "HelloDemo";
  }

  oid uuid;

  rule copy {
    target tgt class "HelloDemo.Persons.Target";
    source s from src class "HelloDemo.Persons.Source";

    assign {
      Label = trim(s.Name);
      LabelGross = upper(trim(s.Name));
      Anzahl = s.Anzahl;
      Aktiv = s.Aktiv;
    }
  }
}
Ausführung
ilitransformer validate-mapping -m profile.ilimap
ilitransformer transform -m profile.ilimap --validate

Demo 01 — Hello Copy (YAML)

Gleiches Mapping als YAML (mapping.yml)
version: 1

job:
  description: "1:1-Kopie mit String-Expressions"
  modeldir:
    - "models/"
  inputs:
    - id: src
      path: "data/input.xtf"
      model: "HelloDemo"
  outputs:
    - id: tgt
      path: "output.xtf"
      model: "HelloDemo"

mapping:
  oidStrategy:
    type: uuid
  rules:
    - id: "copy"
      target:
        output: tgt
        class: "HelloDemo.Persons.Target"
      sources:
        - input: src
          alias: s
          class: "HelloDemo.Persons.Source"
      assign:
        Label: "trim(s.Name)"
        LabelGross: "upper(trim(s.Name))"
        Anzahl: "s.Anzahl"
        Aktiv: "s.Aktiv"

Demo 05 — Bedingungen (ilimap)

mapping v2 {
  job {
    modeldir "models/";
  }

  input src {
    path "input.xtf";
    model "HelloDemo";
  }

  output tgt {
    path "output.xtf";
    model "HelloDemo";
  }

  oid uuid;

  rule conditional {
    target tgt class "HelloDemo.Persons.Target";
    source s from src class "HelloDemo.Persons.Source";

    assign {
      // if, defined, coalesce
      Label = if(defined(s.Name), trim(s.Name), "Unbekannt");
      Status = coalesce(s.StatusA, s.StatusB, #inaktiv);
      Gross = s.Anzahl > 50;
      Kategorie = if(s.Anzahl < 10, "Klein",
                    if(s.Anzahl < 100, "Mittel", "Gross"));
    }
  }
}

Die vollständige Demo-Suite mit allen 9 Beispielen — von einfachen Kopien über BAG OF STRUCTURE bis zu OID-Strategien — finden Sie im Repository unter demo/.

Appendix D: ilimap-Grammatik (EBNF)

Diese Grammatik beschreibt die vollständige Syntax der ilimap-DSL in erweiterter Backus-Naur-Form.

Top-Level

mapping     = "mapping" "v2" [STRING] "{" {job} {input} {output}
              {oid} {basket} {enumBlock} {defaults} {rule} "}"

job         = "job" "{" {stmt} "}"
              stmt = name | description | direction | failPolicy
                   | compileMode | modeldir

input       = "input" ID "{" {path | model | format | option
                           | connection | query} "}"
output      = "output" ID "{" {path | model | format | option} "}"

oid         = "oid" ID ["{" [namespace] "}"] ";"
basket      = "basket" ID ";"
enumBlock   = "enum" ID "{" {entry} "}"
              entry = literal "=>" literal ";"
defaults    = "defaults" "{" {assign} "}"
rule        = "rule" ID "{" target source [{source}] [where]
              [join] [identity] [assignBlock] [defaults]
              {bag} {ref} [{create}] {loss} [metadata] "}"

rule-Elemente

target      = "target" ID "class" STRING ";"
source      = "source" ID "from" ID {"," ID} "class" STRING
              ["where" expr] ";"
where       = "where" expr ";"
join        = "join" ("inner" | "left") ID "to" ID "on" expr ";"
identity    = "identity" expr {"," expr} ";"
assignBlock = "assign" "{" {assign} "}"
assign      = ID "=" expr ";"

bag und ref

bag         = "bag" ID "{" [from] [target] structure [mode]
              [maxItems] [parentRef] [where] [assignBlock]
              {bag} "}"

ref         = "ref" ID "{" [association] [role] [required]
              targetRef "}"

create      = "create" "class" STRING "{" assignBlock "}"
loss        = "loss" "{" sourcePath reasonCode description [when] "}"
metadata    = "metadata" "{" {direction | roundtrip | lossiness} "}"

Lexikalische Tokens

ID          = [a-zA-Z][a-zA-Z0-9_-]*              // symbolId
ALIAS       = [a-zA-Z][a-zA-Z0-9_]*               // aliasId (ohne '-')
STRING      = '"' {char} '"'
INT         = [0-9]+
FLOAT       = [0-9]+ "." [0-9]+
BOOL        = "true" | "false"
NULL        = "null"
HASH        = "#" ID                              // Enum-Literal

COMMENT     = "//" {char} "\n"                    // Zeilenkommentar
            | "/*" {char} "*/"                    // Block-Kommentar

RESERVED    = "mapping" | "job" | "input" | "output" | "oid"
            | "basket" | "enum" | "rule" | "target" | "source"
            | "from" | "where" | "join" | "identity" | "assign"
            | "defaults" | "bag" | "ref" | "create" | "loss"
            | "metadata" | "class" | "inner" | "left" | "mode"
            | "structure" | "maxItems" | "parentRef"
            | "association" | "role" | "required" | "sourcePath"
            | "reasonCode" | "description" | "when" | "direction"
            | "roundtrip" | "lossiness" | "option"
            | "true" | "false" | "null"

Ausdrücke

Die Ausdrucksgrammatik ist in Kapitel 5.10 dokumentiert.