<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Legal Notice! DB Systel GmbH proprietary License!
  ~
  ~ Copyright (C) 2019 DB Systel GmbH
  ~ DB Systel GmbH; Jürgen-Ponto-Platz 1; D-60329 Frankfurt am Main; Germany; [http://www.dbsystel.de/]
  ~
  ~ This code is protected by copyright law and is the exclusive property of
  ~ DB Systel GmbH; Jürgen-Ponto-Platz 1; D-60329 Frankfurt am Main; Germany; [http://www.dbsystel.de/]
  ~
  ~ Consent to use ("licence") shall be granted solely on the basis of a
  ~ written licence agreement signed by the customer and DB Systel GmbH. Any
  ~ other use, in particular copying, redistribution, publication or
  ~ modification of this code without written permission of DB Systel GmbH is
  ~ expressly prohibited.
  ~
  ~ In the event of any permitted copying, redistribution or publication of
  ~ this code, no changes in or deletion of author attribution, trademark
  ~ legend or copyright notice shall be made.
  -->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:tns="http://dbnetz.com/ISDaten/TagesLa/V01"
           targetNamespace="http://dbnetz.com/ISDaten/TagesLa/V01"
           version="1.0">
    <xs:annotation>
        <xs:documentation xml:lang="de">
            Eine Tages-La-Lieferung enthält alle La-Einträge, die
            den Tag inklusive Vor- und Rückschau zeitlich berühren.
            Eine Lieferung enthält
            (1) Verwendete GFD-I Infrastruktur
            (2) Zuordnungen der La-Heft-Strecken zu VzG-Strecken
            (3) Symboldateien
            (4) Overlay-Betriebsstellen
            (5) La-Einträge

            Die Liste der La-Heft-Strecken und der Overlay-
            Betriebsstellen ist vollständig, d.h. alle La-Heft-
            Strecken und alle erfassten Obstlagen sind enthalten,
            unabhängig davon, ob dort auch La-Einträge vorliegen.
            Die Liste der Symboldateien ist ebenfalls vollständig,
            unabhängig davon, ob die Symbole in La-Einträge verwendet
            werden.
        </xs:documentation>
    </xs:annotation>

    <!-- das konkrete Wurzelelement: eine La-Lieferung -->
    <xs:element name="lieferung" type="tns:lieferungType"/>
    <!-- Typdefinitionen -->
    <!-- xs:decimal verwendet einen DezimalPUNKT, kein Komma -->
    <!-- xs:date hat Format YYYY-MM-DD, z.B. 2003-10-17 -->
    <!-- xs:dateTime hat Format YYYY-MM-DDThh:mm:ss+0[1|2]:00, z.B. 2003-10-17T12:08:42+02:00 -->
    <!-- Die La-Lieferung (zu aktualisierende La-Daten) -->
    <!-- parameter: formlose Doku der Export-Einstellungen (schalter=wert, eine Zeile pro Schalter) -->
    <xs:complexType name="lieferungType">
        <xs:sequence>
            <xs:element name="id" type="tns:idType"/>
            <xs:element name="generierungszeitpunkt" type="xs:dateTime"/>
            <xs:element name="version" type="xs:string"/>
            <xs:element name="parameter" type="xs:string" minOccurs="0"/>
            <xs:element name="druckbereich" type="xs:string"/>
            <xs:element name="ausgabedatum" type="xs:date"/>
            <xs:element name="geltungsdauer" type="tns:exakterZeitraumType"/>
            <xs:element name="gfdiInfrastruktur" type="tns:gfdiInfrastrukturType"/>
            <xs:element name="freitextTitelblatt" type="xs:string"/>
            <xs:element name="vorbemerkungen" type="xs:string"/>
            <xs:element name="laStrecken" type="tns:laStreckenType"/>
            <xs:element name="symboleUndAbkuerzungen" type="tns:symboleUndAbkuerzungenType"/>
            <xs:element name="obstlagen" type="tns:obstlagenType"/>
            <xs:element name="eintraege" type="tns:eintraegeType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="gfdiInfrastrukturType">
        <xs:sequence>
            <!-- id = technischer Schlüssel der Infrastruktur in GFD-I-Datenbank -->
            <xs:element name="id" type="tns:idType"/>
            <xs:element name="infrastrukturName" type="xs:string"/>
            <xs:element name="infrastrukturVersion" type="xs:string"/>
            <xs:element name="infrastrukturArt" type="xs:string"/>
            <xs:element name="gueltigkeit" type="tns:exakterZeitraumType"/>
        </xs:sequence>
    </xs:complexType>

    <!-- Liste aller VzG-Streckenzuordungen zu La-Heft-Strecken -->
    <!-- VzG-Streckennummern in Reihenfolge der Durchfahrung -->
    <xs:complexType name="laStreckenType">
        <xs:sequence>
            <xs:element name="laStreckenzuordnung" type="tns:laStreckenzuordnungType" minOccurs="0" maxOccurs="6000"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="laStreckenzuordnungType">
        <xs:sequence>
            <xs:element name="laStrecke" type="tns:laStreckeType"/>
            <xs:element name="vzgStreckennummer" type="tns:vzgStreckennummerType" minOccurs="0" maxOccurs="50"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="laStreckeType">
        <xs:sequence>
            <xs:element name="laStreckennummer" type="xs:string"/>
            <xs:element name="druckbereich" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <!-- Liste aller Symbole und Abkuerzungen -->
    <xs:complexType name="symboleUndAbkuerzungenType">
        <xs:sequence>
            <xs:element name="symbolOderAbkuerzung" type="tns:symbolAbkuerzungType" minOccurs="0" maxOccurs="150"/>
        </xs:sequence>
    </xs:complexType>
    <!-- Um die Symboldateien nicht wiederholt in der Tabellendarstellung aufzuführen -->
    <!-- hier ein Dictionary für die Symbole und auch für die Abkuerzungen -->
    <xs:complexType name="symbolAbkuerzungType">
        <xs:sequence>
            <xs:choice>
                <xs:element name="symbol" type="tns:symbolType"/>
                <xs:element name="abkuerzung" type="xs:string"/>
            </xs:choice>
            <xs:element name="spalte" type="xs:string"/>
            <xs:element name="bedeutung" type="xs:string"/>
        </xs:sequence>
        <!-- ein Symbol -->
    </xs:complexType>
    <xs:complexType name="symbolType">
        <xs:sequence>
            <xs:element name="nummer" type="tns:symbolnummerType"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="data" type="xs:base64Binary"/>
        </xs:sequence>
    </xs:complexType>
    <!-- die Nummer eines darzustellenden grafischen Symbols -->
    <xs:simpleType name="symbolnummerType">
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="1"/>
            <xs:maxInclusive value="255"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- Liste aller Overlay-Betriebsstellenlagen -->
    <xs:complexType name="obstlagenType">
        <xs:sequence>
            <xs:element name="obstlage" type="tns:obstlageType" minOccurs="0" maxOccurs="100"/>
        </xs:sequence>
    </xs:complexType>
    <!-- Overlay-Betriebsstellenlage -->
    <!-- Es werden ausschließlich Overlay-Betriebsstellenlagen zu gfdiInfrastruktur gelistet. -->
    <!-- id = technischer Schlüssel der (Overlay-)Betriebsstellenlage (BTRST_LAGE_KEY) -->
    <!-- btrstArt = Bezeichnung der Betriebsstellenart, z.B. Bf -->
    <!-- geltungsdauer; optional = Geltungsdauer der Infrastrukturversion aus gfdiInfrastruktur -->
    <xs:complexType name="obstlageType">
        <xs:sequence>
            <xs:element name="id" type="tns:idType"/>
            <xs:element name="betriebsstelle" type="tns:betriebsstelleType"/>
            <xs:element name="btrstArt" type="xs:string" minOccurs="0"/>
            <xs:element name="vzgStrecke" type="tns:vzgStreckeType"/>
            <xs:element name="beiKm" type="tns:kmLageType"/>
            <xs:element name="geltungsdauer" type="tns:exakterZeitraumType" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <!-- die id eines La- oder Overlay-Eintrags -->
    <xs:simpleType name="idType">
        <xs:restriction base="xs:positiveInteger"/>
    </xs:simpleType>

    <!-- Liste aller La-Eintraege -->
    <xs:complexType name="eintraegeType">
        <xs:sequence>
            <xs:element name="eintrag" type="tns:eintragType" minOccurs="0" maxOccurs="30000"/>
        </xs:sequence>
    </xs:complexType>
    <!-- ein La-Eintrag -->
    <xs:complexType name="eintragType">
        <xs:sequence>
            <xs:element name="kopf" type="tns:kopfType"/>
            <xs:element name="tabellendarstellung" type="tns:tabellendarstellungType" maxOccurs="100"/>
        </xs:sequence>
    </xs:complexType>
    <!-- der Kopf eines La-Eintrags mit Verwaltungselementen -->
    <xs:complexType name="kopfType">
        <xs:sequence>
            <xs:element name="id" type="tns:idType"/>
            <xs:element name="art" type="tns:artType"/>
            <xs:element name="vzgStrecke" type="tns:vzgStreckeType"/>
            <xs:element name="laStrecke" type="tns:laStreckeMitRichtungType" minOccurs="0" maxOccurs="100"/>
            <xs:element name="richtung" type="tns:richtungType"/>
            <xs:element name="gleis" type="tns:gleisType"/>
            <xs:element name="lf1Km" type="tns:kmLageType" minOccurs="0"/>
            <!-- vonKm/bisKm in Streckendefinitionsrichtung -->
            <xs:element name="vonKm" type="tns:kmLageType" minOccurs="0"/>
            <xs:element name="bisKm" type="tns:kmLageType" minOccurs="0"/>
            <xs:element name="ursprungId" type="tns:idType" minOccurs="0"/>
            <!-- Alle La-Einträge, die dieselbe Langsamfahrstelle bei Bezug zu unter-
            schiedlichen Strecken referenzieren, müssen dieselbe Ursprungs-Id haben. -->
            <xs:element name="gruppeId" type="tns:idType" minOccurs="0"/>
            <!-- Alle La-Einträge, die zur selben Langsamfahrstelle bei Ausdehnung
            über mehrere Strecken gehören, müssen dieselbe Gruppen-Id haben. -->
            <xs:element name="ueberId" type="tns:idType" minOccurs="0"/>
            <xs:element name="reparaturVonId" type="tns:idType" minOccurs="0"/>
            <xs:element name="vonBetriebsstelle" type="tns:betriebsstelleType"/>
            <xs:element name="bisBetriebsstelle" type="tns:betriebsstelleType" minOccurs="0"/>
            <xs:element name="vonAndereBetriebsstelle" type="tns:betriebsstelleType" minOccurs="0"/>
            <xs:element name="bisAndereBetriebsstelle" type="tns:betriebsstelleType" minOccurs="0"/>
            <xs:element name="nichtDurchgHauptgleis" type="xs:boolean"/>
            <xs:element name="undNichtDurchgHauptgleis" type="xs:boolean"/>
            <xs:element name="imBahnhof" type="xs:boolean"/>
            <xs:element name="geltungsdauer" type="tns:exakterZeitraumType" maxOccurs="50"/>
            <xs:element name="konsistent" type="xs:boolean"/>
            <xs:element name="letzteAenderung" type="xs:dateTime"/>
            <xs:element name="neuKennzeichen" type="xs:boolean"/>
            <xs:element name="infrastrukturModifiziert" type="xs:boolean"/>
            <xs:element name="verkehrstagesSchluessel" type="xs:nonNegativeInteger" minOccurs="0"/>
            <xs:element name="vonUhrzeit" type="xs:time" minOccurs="0"/>
            <xs:element name="bisUhrzeit" type="xs:time" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <!-- die Art eines La-Eintrags -->
    <xs:simpleType name="artType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Geschwindigkeit"/>
            <xs:enumeration value="Gleiswechselbetrieb"/>
            <xs:enumeration value="Gegengleis Zs 8 oder Befehl"/>
            <xs:enumeration value="Buegel ab"/>
            <xs:enumeration value="Hauptschalter aus"/>
            <xs:enumeration value="Oberstrombegrenzung"/>
            <xs:enumeration value="Halteplatz veraendert"/>
            <xs:enumeration value="Signale"/>
            <xs:enumeration value="Betriebsstelle veraendert"/>
            <xs:enumeration value="Bahnuebergang"/>
            <xs:enumeration value="Zugfunk"/>
            <xs:enumeration value="Streckenausruestung"/>
            <xs:enumeration value="GUE eingebaut"/>
            <xs:enumeration value="Hinweis zu einem Lf 1, Lf 3 oder El 3"/>
            <xs:enumeration value="Absturzgefahr"/>
            <xs:enumeration value="Heizverbot"/>
            <xs:enumeration value="Zeitweilige Besonderheiten"/>
            <xs:enumeration value="Richtungsanzeiger"/>
            <xs:enumeration value="Gegengleis in anderer Strecke"/>
            <xs:enumeration value="Wechsel betr. Regeln ex DB/DR"/>
            <xs:enumeration value="Ende Weichenbereich"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="vzgStreckeType">
        <xs:sequence>
            <xs:element name="vzgStreckennummer" type="tns:vzgStreckennummerType"/>
            <xs:element name="vzgStreckenname" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <!-- eine GFD-I-Streckennummer -->
    <xs:simpleType name="vzgStreckennummerType">
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="1"/>
            <xs:maxInclusive value="9999"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="laStreckeMitRichtungType">
        <xs:sequence>
            <xs:element name="laStreckennummer" type="xs:string"/>
            <xs:element name="laStreckenrichtung" type="tns:laStreckenrichtungType"/>
            <xs:element name="druckbereich" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <!-- eine Kilometrierung -->
    <xs:complexType name="kmLageType">
        <xs:sequence>
            <xs:element name="kilometrierung" type="xs:decimal"/>
            <xs:element name="ueberlaenge" type="xs:decimal" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <!-- die Richtung der La-Heft-Strecke -->
    <xs:simpleType name="laStreckenrichtungType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="a"/>
            <xs:enumeration value="b"/>
        </xs:restriction>
    </xs:simpleType>
    <!-- die Richtung (bzgl. VzG-Streckendefinitionsrichtung) -->
    <xs:simpleType name="richtungType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="auf"/>
            <xs:enumeration value="ab"/>
        </xs:restriction>
    </xs:simpleType>
    <!-- ein sekundengenauer Zeitraum -->
    <xs:complexType name="exakterZeitraumType">
        <xs:sequence>
            <xs:element name="von" type="xs:dateTime"/>
            <xs:element name="bis" type="xs:dateTime"/>
        </xs:sequence>
    </xs:complexType>
    <!-- die Gleislage (bzgl. Streckendefinitionsrichtung) -->
    <xs:simpleType name="gleisType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Regelgleis"/>
            <xs:enumeration value="Gegengleis"/>
            <xs:enumeration value="beide Gleise"/>
            <xs:enumeration value="eingleisig"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="betriebsstelleType">
        <xs:sequence>
            <xs:element name="ril100" type="xs:string"/>
            <xs:element name="betriebsstelleName" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <!-- eine formatierte Zeile der Tabellendarstellung -->
    <xs:complexType name="zeileType">
        <xs:sequence>
            <xs:element name="symbol" type="tns:symbolnummerType" minOccurs="0" maxOccurs="30"/>
            <xs:element name="text" type="xs:string" minOccurs="0"/>
            <xs:element name="format" type="tns:formatType" minOccurs="0"/>
            <!-- ein solcher Text enthaelt keine Zeilenumbrueche und keine Tabulatoren -->
            <!-- das format bezieht sich auf text -->
        </xs:sequence>
    </xs:complexType>
    <!-- eine Formatangabe (im Sinne einer Formatvorlage) -->
    <xs:simpleType name="formatType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="normal"/>
            <xs:enumeration value="gross"/>
            <xs:enumeration value="fett"/>
            <xs:enumeration value="geschwindigkeit"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- die Tabellendarstellung (für das La-Heft) eines La-Eintrags -->
    <xs:complexType name="tabellendarstellungType">
        <xs:sequence>
            <xs:element name="beiKm" type="tns:kmLageType"/>
            <xs:element name="spalte2" type="tns:zelleType"/>
            <xs:element name="spalte3" type="tns:zelleType" maxOccurs="50"/>
            <xs:element name="spalte4" type="tns:zelleType" maxOccurs="50"/>
            <xs:element name="spalte5" type="tns:zelleType" maxOccurs="50"/>
            <xs:element name="spalte6" type="tns:zelleType" maxOccurs="50"/>
            <xs:element name="spalte7" type="tns:zelleType" maxOccurs="50"/>
            <xs:element name="spalte8" type="tns:zelleType" maxOccurs="50"/>
        </xs:sequence>
    </xs:complexType>
    <!-- eine formatierte Zelle der Tabellendarstellung; sie kann mehrere Zeilen enthalten -->
    <xs:complexType name="zelleType">
        <xs:sequence>
            <xs:element name="rowspan" type="xs:nonNegativeInteger"/>
            <xs:element name="zeile" type="tns:zeileType" minOccurs="0" maxOccurs="50"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
