Aktuelle Remote-Seminare mit Durchführungsgarantie: Etwas Werbung in eigener Sache Termine: 03.08.-05.08.2020, 21.09.-23.09.2020, 23.11.-25.11.2020, 07.12.-09.12.2020, 22.03.-24.03.2021, 07.06.-09.06.2021, 06.09.-08.09.2021XML Einführung und Grundlagen Termine: 06.08.2020, 20.10.2020, 13.11.2020, 10.12.2020, 25.03.2021, 10.06.2021, 09.09.2021XML - der professionelle Überblick Termine: 23.11.-26.11.2020, 29.03.-01.04.2021Einstieg in die Programmierung Termine: 17.08.-19.08.2020, 14.12.-16.12.2020, 07.04.-09.04.2021XML, XSLT, XPath, XSL-FO Einführung Termine: Termin nach WunschEinstieg in C#.NET Termine: 21.09.-23.09.2020, 11.01.-13.01.2021, 26.05.-28.05.2021, 27.09.-29.09.2021VB.NET für Visual Basic-Programmierer Termine: 21.10.-23.10.2020, 14.12.-16.12.2020, 08.03.-10.03.2021, 19.07.-21.07.2021, 23.08.-25.08.2021XML Grundlagen, XSL-FO, SVG, DocBook, DITA Termine: Termin nach WunschJava Grundlagen Termine: 03.08.-06.08.2020, 30.11.-03.12.2020, 29.03.-01.04.2021C++ für Programmiereinsteiger Termine: 10.09.2020, 11.12.2020, 16.03.2021Neues Seminar: XProc Grundlagen Termine: 21.09.-25.09.2020, 01.03.-05.03.2021Java/JSP/HTML/JDBC/XML Komplett Termine: 07.09.-09.09.2020, 21.10.-23.10.2020, 23.11.-25.11.2020, 25.01.-27.01.2021, 12.04.-14.04.2021, 26.07.-28.07.2021Python für Programmiereinsteiger Last-Minute-Seminare, noch freie Plätze XML Einführung und Grundlagen03.08.-05.08.2020 XML, XSLT, XPath, XSL-FO Einführung17.08.-19.08.2020 Python für Programmiereinsteiger07.09.-09.09.2020

XPROC * XSL-FO * SVG * XML * XML-SCHEMA * XPATH * XSL * XSLT 1.0 * XSLT 2.0 * XSLT 3.0 * XQUERY * ANT



XML-Schema / xs:choice

xs:choice

xs:choice

xs:choice bietet in der Regel mehrere Auswahloptionen für Childnodes an.

Auf dieser Seite:

Das folgende XML-Schema deklartiert ein Element Sprachen, das entweder einen Childnode deutsch, englisch oder spanisch zulässt.

Wenn xs:choice so gestaltet ist, dass Sie aus mehreren Optionen nur eine einzige auswählen können (also zwei andere ausselektieren müssen), dann ist es nicht möglich, ein einziges XML-Dokument zu generieren, das alle drei Fälle zulässt. Das ist beispielsweise hier der Fall:


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:element name="Sprachen">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="deutsch"/>
                <xs:element ref="englisch"/>
                <xs:element ref="spanisch"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="deutsch" />
    <xs:element name="englisch" />
    <xs:element name="spanisch" />
</xs:schema>

XML-Schema-valide wäre hier also entweder dieses XML-Dokument:


<Sprachen>
    <englisch></englisch>    
</Sprachen>

... oder dieses:


<Sprachen>
    <deutsch></deutsch>    
</Sprachen>

... oder dieses:


<Sprachen>
    <spanisch></spanisch>
</Sprachen>

Dieses jedoch nicht:


<Sprachen>
    <deutsch></deutsch>
    <spanisch></spanisch>
</Sprachen>

xs:choice und minOccurs="0"

Wenn Sie xs:choice optional setzen (minOccurs="0"):


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:element name="Sprachen">
        <xs:complexType>
            <xs:choice minOccurs="0">
                <xs:element ref="deutsch"/>
                <xs:element ref="englisch"/>
                <xs:element ref="spanisch"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="deutsch" />
    <xs:element name="englisch" />
    <xs:element name="spanisch" />
</xs:schema>

... so ist auch dieses Ergebnis valide:


<Sprachen />

Die Verwendung von minOccurs="0" bei den xs:choice-Items bedeuted jedoch nicht, dass diese nachrangig betrachtet würden.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:element name="Sprachen">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="deutsch"/>
                <xs:element ref="englisch"/>
                <xs:element ref="spanisch" minOccurs="0"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="deutsch" />
    <xs:element name="englisch" />
    <xs:element name="spanisch" />
</xs:schema>

Obwohl im obigen Beispiel "spanisch" optional gesetzt wurde, ist das folgende XML-Dokument valide:


<Sprachen>
    <spanisch/>    
</Sprachen>

Valide ist ebenfalls:


<Sprachen />

xs:choice maxOccurs="unbounded"

Würden Sie jedoch mit maxOccurs="unbounded" eine mehrfache Auswahl zulassen, ...


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:element name="Sprachen">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element ref="deutsch"/>
                <xs:element ref="englisch"/>
                <xs:element ref="spanisch"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="deutsch" />
    <xs:element name="englisch" />
    <xs:element name="spanisch" />
</xs:schema>

pic/xs_choice.png

... so wäre das folgende XML-Dokument valide gegenüber dem XML-Schema. Hier haben Sie die Möglichkeit, ein einziges XML-Dokument zu generieren, das sämtliche Fälle (auch mehrfach) zulässt.


<Sprachen>
    <deutsch></deutsch>
    <spanisch></spanisch>
    <englisch></englisch>
    <deutsch></deutsch>
    <englisch></englisch>
    <spanisch></spanisch>
</Sprachen>

xs:sequence, xs:choice/xs:choice

Etwas komplexer scheint die Verwendung einer xs:choice als Childnode einer xs:choice zu sein. Hier werden bestimmte Elemente scheinbar in den Vordergrund gestellt, die Alternativen sehen nachrangig aus.

pic/xs_choice_xs_choice1.png


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:element name="Mittagskarte">
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="0">
                    <xs:element ref="Suppe1"/>
                    <xs:choice>
                        <xs:element ref="Suppe2"/>
                        <xs:element ref="Suppe3"/>    
                    </xs:choice>                    
                </xs:choice>
                <xs:choice>
                    <xs:element ref="Hauptmenue1"/>
                    <xs:choice>
                        <xs:element ref="Hauptmenue2"/>
                        <xs:element ref="Hauptmenue3"/>    
                    </xs:choice>                    
                </xs:choice>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="Dessert1"/>
                    <xs:element ref="Dessert2"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Suppe1" type="xs:string"/>
    <xs:element name="Suppe2" type="xs:string"/>
    <xs:element name="Suppe3" type="xs:string"/>
    <xs:element name="Hauptmenue1" type="xs:string"/>
    <xs:element name="Hauptmenue2" type="xs:string"/>
    <xs:element name="Hauptmenue3" type="xs:string"/>
    <xs:element name="Dessert1" type="xs:string"/>
    <xs:element name="Dessert2" type="xs:string"/>
</xs:schema>

Einen alternativen Ansatz finden Sie hier:

pic/xs_choice_xs_choice2.png


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:element name="Mittagskarte">
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="0">
                    <xs:element ref="Suppe1"/>                    
                    <xs:element ref="Suppe2"/>
                    <xs:element ref="Suppe3"/>
                </xs:choice>
                <xs:choice>
                    <xs:element ref="Hauptmenue1"/>                    
                    <xs:element ref="Hauptmenue2"/>
                    <xs:element ref="Hauptmenue3"/>
                </xs:choice>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="Dessert1"/>
                    <xs:element ref="Dessert2"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Suppe1" type="xs:string"/>
    <xs:element name="Suppe2" type="xs:string"/>
    <xs:element name="Suppe3" type="xs:string"/>
    <xs:element name="Hauptmenue1" type="xs:string"/>
    <xs:element name="Hauptmenue2" type="xs:string"/>
    <xs:element name="Hauptmenue3" type="xs:string"/>
    <xs:element name="Dessert1" type="xs:string"/>
    <xs:element name="Dessert2" type="xs:string"/>
</xs:schema>

In beiden Fällen ist das folgende XML-Dokument Schema-valide:


<Mittagskarte>
    <Suppe2>Suppe20</Suppe2>    
    <Hauptmenue2>Hauptmenue30</Hauptmenue2>    
    <Dessert2>Dessert20</Dessert2>
</Mittagskarte>

Siehe auch .

wg / 1. Mai 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XSD3_9.html