Möchte man ein bestehendes Interlismodell erweitern, kann man dies Mittels IMPORTS und EXTENDS bzw. EXTENDED vornehmen.
Als Beispiel folgendes Basismodell:
INTERLIS 2.3;
MODEL Basiskonstrukt (de) AT "https://localhost" VERSION "2023-04-25" =
DOMAIN
TOPIC Basis =
CLASS Info =
foo : TEXT*10;
END Info;
CLASS Dokument =
DokImWeb : URI;
END Dokument;
ASSOCIATION Dokument_Info_M2N =
rInfoM2N -- {0..*} Info;
rDokumentM2N -- {0..*} Dokument;
END Dokument_Info_M2N;
ASSOCIATION Dokument_Info =
rInfo -- {0..*} Info;
rDokument -- {1} Dokument;
END Dokument_Info;
END Basis;
END Basiskonstrukt.
Dies kann nun mittels IMPORTS und EXTENDS erweitert werden:
INTERLIS 2.3;
MODEL Model_XY (de) AT "https://localhost" VERSION "2023-08-16" =
IMPORTS Basiskonstrukt;
DOMAIN
TOPIC ThemaX =
CLASS Info EXTENDS Basiskonstrukt.Basis.Info = END Info;
CLASS Dokument EXTENDS Basiskonstrukt.Basis.Dokument = END Dokument;
ASSOCIATION Dokument_Info_M2N EXTENDS Basiskonstrukt.Basis.Dokument_Info_M2N = END Dokument_Info_M2N;
CLASS NewClass =
text : MANDATORY TEXT*10;
END NewClass;
ASSOCIATION Info_NewClass =
rNewClass -- {0..*} NewClass;
rInfoxy -- {1} Info;
END Info_NewClass;
END ThemaX;
END Model_XY.
Oder auch mittels IMPORTS und EXTENDED:
INTERLIS 2.3;
MODEL Model_XY (de) AT "https://localhost" VERSION "2023-08-16" =
IMPORTS Basiskonstrukt;
DOMAIN
TOPIC ThemaX EXTENDS Basiskonstrukt.Basis =
CLASS Info (EXTENDED) = END Info;
CLASS Dokument (EXTENDED) = END Dokument;
ASSOCIATION Dokument_Info_M2N (EXTENDED) = END Dokument_Info_M2N;
CLASS NewClass =
text : MANDATORY TEXT*10;
END NewClass;
ASSOCIATION Info_NewClass =
rNewClass -- {0..*} NewClass;
rInfoxy -- {1} Info;
END Info_NewClass;
END ThemaX;
END Model_XY.
Mit beiden erweiterten Modellvarianten ist folgendes Transferfile valide:
<?xml version="1.0" encoding="UTF-8"?>
<TRANSFER xmlns="http://www.interlis.ch/INTERLIS2.3">
<HEADERSECTION SENDER="manual" VERSION="2.3">
<MODELS>
<MODEL NAME="Model_XY" VERSION="2023-08-16" URI="https://localhost"></MODEL>
</MODELS>
</HEADERSECTION>
<DATASECTION>
<Model_XY.ThemaX BID="1">
<Model_XY.ThemaX.Info TID="2">
<foo>test</foo>
<rDokument REF="3"></rDokument>
</Model_XY.ThemaX.Info>
<Model_XY.ThemaX.Dokument TID="3">
<DokImWeb>https://meine-dat.ei</DokImWeb>
</Model_XY.ThemaX.Dokument>
<Model_XY.ThemaX.NewClass TID="4">
<text>test</text>
<rInfoxy REF="2"></rInfoxy>
</Model_XY.ThemaX.NewClass>
<Model_XY.ThemaX.Dokument_Info_M2N>
<rInfoM2N REF="2"></rInfoM2N>
<rDokumentM2N REF="3"></rDokumentM2N>
</Model_XY.ThemaX.Dokument_Info_M2N>
</Model_XY.ThemaX>
</DATASECTION>
</TRANSFER>
Nun zur effektiven Frage bzw. Unverständnis. Weshalb werden bei einem EXTENDS auf Topic-Ebene nicht alle Klassen und Beziehungen übernommen? Im Referenzhandbuch zu Interlis 2.3 steht auf S. 30:
Erweitert ein Thema ein anderes, werden alle Klassen des geerbten Themas übernommen. Sie werden also zu Klassen das aktuellen Themas und haben denselben Namen wie im geerbten Thema.
Somit hätte ich gedacht das der ilivalidator folgendes Modell zusammen mit dem obigen Transferfile auch als valide anschauen sollte:
INTERLIS 2.3;
MODEL Model_XY (de) AT "https://localhost" VERSION "2023-04-25" =
IMPORTS Basiskonstrukt;
DOMAIN
TOPIC ThemaX EXTENDS Basiskonstrukt.Basis =
CLASS NewClass =
text : MANDATORY TEXT*10;
END NewClass;
ASSOCIATION Info_NewClass =
rNewClass -- {0..*} NewClass;
rInfoxy -- {1} Info;
END Info_NewClass;
END ThemaX;
END Model_XY.
Der Ilivalidator spukt nun jedoch Fehler aus:
Error: line 10: Model_XY.ThemaX.Info: tid 2: unknown class <Model_XY.ThemaX.Info>
Error: line 15: Model_XY.ThemaX.Dokument: tid 3: unknown class <Model_XY.ThemaX.Dokument>
Error: line 24: Model_XY.ThemaX.Dokument_Info_M2N: unknown class <Model_XY.ThemaX.Dokument_Info_M2N>
Somit besteht keine Möglichkeit ein Topic eines anderen Modells komplett zu erweitern ohne alle Klassen und Beziehungen nochmals „leer“ zu erweitern ?