# 1:1 Relation in XSD darstellen



## codemagic (23. Feb 2014)

Schönen guten Tag,

wie kann ich eine 1:1 Relation in einer XML Schema Definition darstellen? Ich hab leider nur wenige Beispiele gefunden die aber nicht so ganz verstanden...

Daher habe ich mal selbst ein Beispiel genommen, wäre voll nett wenn es jemand ergänzen könnte.

Ich hoffe es ist selbsterklärend bzw gut dokumentiert 

tia;(

[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsd:documentation>
(c) Marcel Flaig - codemagic.net
This ement is a complexType which consist of a short abreviation and a long name for each unit. 
longname starts with a capital letter, shortname doesn't.
</xsd:documentation>

<!-- complexType Unit -->
<xs:element name="Unit">
  <xs:complexType>
        <xs:sequence>
             <xs:element name = "Unit_shortname" type = "unit_shortname" />
             <xs:element name = "Unit_longname" type = "unit_longname" />
        </xs:sequence>
	</xs:complexType>
</xs:element>

<!-- unit shortname -->
<xs:simpleType name="unit_shortname">
  <xs:restriction base="xs:string"> 
   <xs:enumeration value="ml"/>
   <xs:enumeration value="l"/>
   <xs:enumeration value="pcs"/> 
   <xs:enumeration value="g"/>
   <xs:enumeration value="kg"/>
  </xs:restriction>
</xs:simpleType>

<!-- unit longname -->
<xs:simpleType name="unit_shortname">
  <xs:restriction base="xs:string"> 
   <xs:enumeration value="MilliLiter"/>
   <xs:enumeration value="Liter"/>
   <xs:enumeration value="Pieces"/>
   <xs:enumeration value="Gramm"/>
   <xs:enumeration value="Kilo-Gramm"/>
  </xs:restriction>
</xs:simpleType>
[/XML]

Also das hier z.B. hatte ich gelesen: XML - Managing Data Exchange/The one-to-one relationship - Wikibooks, open books for an open world

Was mir halt absolut nicht klar ist wo die Schlüssel sind... also primary key und foreign key


----------



## Barista (23. Feb 2014)

In der Zeile 32 müsste es wahrscheinlich Unit_longname heissen.

Aber das löst nicht dein Problem.

Warum musst Du überhaupt *Unit_shortname *und *Unit_longname *im XML speichern,
das ist doch eine redundante Information?

Wenn Du das unbedingt willst, dann packe doch *Unit_shortname *und *Unit_longname* in einen Typ.

Ach so, hast Du schon *Unit*.

Den Typ Unit machst Du *abstrakt*.

Davon leitest Du für jede Paarung einen *finalen *Typ ab,
der dann verwendet werden muss.


----------



## Barista (23. Feb 2014)

In den finalen Typen die Werte dann mit *fixed* konstant festlegen.


----------



## codemagic (25. Feb 2014)

Hi,

erstmal Danke für deine Antwort,
in Zeile 32 ist absichtlich groß bzw klein geschrieben da ich so Element und Typ unterscheide,
müsste also imho richtig so sein.

Leider schein ich es immernoch nicht geblickt zu haben, abstract=true und final extension ?!
Müsste man hier nicht 2 HilfsKeys "ID" einfügen? (key /keyref) ich glaub ich versteh das Konzept noch nicht so ganz...

Kannst du mein Beispiel evtl. anpassen?


----------



## Barista (25. Feb 2014)

> in Zeile 32 ist absichtlich groß bzw klein geschrieben da ich so Element und Typ unterscheide



[XML]
<xs:simpleType name="unit_shortname">

<xs:simpleType name="Unit_longname">
[/XML]

In Zeile 32 meinte ich *Unit_longname* statt *unit_shortname*.




> Kannst du mein Beispiel evtl. anpassen?



Ich habe keinen XSD-Editor zur Hand.
Mal schauen was in der Eclipse drin ist.


----------



## Barista (25. Feb 2014)

Ich habe es mal so probiert, geht aber nicht:

[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

	<!-- complexType Unit -->
	<xs:complexType name="abstractUnit" abstract="true">
		<!--xs:sequence>
			<xs:element name="Unit_shortname" type="xs:string" />
			<xs:element name="Unit_longname" type="xs:string" />
		</xs:sequence-->
	</xs:complexType>

	<xs:complexType name="mlUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="ml" />
					<xs:element name="Unit_longname" fixed="MilliLiter" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="lUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="l" />
					<xs:element name="Unit_longname" fixed="Liter" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="pcsUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="pcs" />
					<xs:element name="Unit_longname" fixed="Pieces" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="gUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="g" />
					<xs:element name="Unit_longname" fixed="Gramm" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="kgUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="kg" />
					<xs:element name="Unit_longname" fixed="Kilo-Gramm" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

</xs:schema>
[/XML]


----------



## Barista (25. Feb 2014)

Ich habe mal ein Buch rausgekramt und zwei Lösungen gemacht.

Hier die Lösung mit choice:

Datei codemagic_choice.xsd
[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="Units">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Unit" type="Unit" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

	<xs:complexType name="Unit">
			<xs:choice>
				<xs:element name="mlUnit" type="mlUnit" />
				<xs:element name="lUnit" type="lUnit" />
				<xs:element name="pcsUnit" type="pcsUnit" />
				<xs:element name="gUnit" type="gUnit" />
				<xs:element name="kgUnit" type="kgUnit" />
			</xs:choice>
	</xs:complexType>

	<!-- complexType Unit -->
	<xs:complexType name="mlUnit">
		<xs:sequence>
			<xs:element name="Unit_shortname" fixed="ml" />
			<xs:element name="Unit_longname" fixed="MilliLiter" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="lUnit">
		<xs:sequence>
			<xs:element name="Unit_shortname" fixed="l" />
			<xs:element name="Unit_longname" fixed="Liter" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="pcsUnit">
		<xs:sequence>
			<xs:element name="Unit_shortname" fixed="pcs" />
			<xs:element name="Unit_longname" fixed="Pieces" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="gUnit">
		<xs:sequence>
			<xs:element name="Unit_shortname" fixed="g" />
			<xs:element name="Unit_longname" fixed="Gramm" />
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="kgUnit">
		<xs:sequence>
			<xs:element name="Unit_shortname" fixed="kg" />
			<xs:element name="Unit_longname" fixed="Kilo-Gramm" />
		</xs:sequence>
	</xs:complexType>

</xs:schema>
[/XML]

Datei codemagic_choice.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<Units
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="codemagic_choice.xsd">
	<Unit>
		<mlUnit>
			<Unit_shortname>ml</Unit_shortname>
			<Unit_longname>MilliLiter</Unit_longname>
		</mlUnit>
	</Unit>
    <Unit>
        <lUnit>
            <Unit_shortname>l</Unit_shortname>
            <Unit_longname>Liter</Unit_longname>
        </lUnit>
    </Unit>
    <Unit>
        <pcsUnit>
            <Unit_shortname>pcs</Unit_shortname>
            <Unit_longname>Pieces</Unit_longname>
        </pcsUnit>
    </Unit>
    <Unit>
        <gUnit>
            <Unit_shortname>g</Unit_shortname>
            <Unit_longname>Gramm</Unit_longname>
        </gUnit>
    </Unit>
    <Unit>
        <kgUnit>
            <Unit_shortname>kg</Unit_shortname>
            <Unit_longname>Kilo-Gramm</Unit_longname>
        </kgUnit>
    </Unit>
</Units>
[/XML]


----------



## Barista (25. Feb 2014)

Hier die Lösung mit extension:

Datei codemagic_extension.xsd
[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

	<xs:element name="Units">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Unit" type="abstractUnit" maxOccurs="unbounded" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>

	<!-- complexType Unit -->
	<xs:complexType name="abstractUnit" abstract="true">
	</xs:complexType>

	<xs:complexType name="mlUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="ml" />
					<xs:element name="Unit_longname" fixed="MilliLiter" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="lUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="l" />
					<xs:element name="Unit_longname" fixed="Liter" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="pcsUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="pcs" />
					<xs:element name="Unit_longname" fixed="Pieces" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="gUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="g" />
					<xs:element name="Unit_longname" fixed="Gramm" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="kgUnit">
		<xs:complexContent>
			<xs:extension base="abstractUnit">
				<xs:sequence>
					<xs:element name="Unit_shortname" fixed="kg" />
					<xs:element name="Unit_longname" fixed="Kilo-Gramm" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

</xs:schema>
[/XML]

Datei codemagic_extension.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<Units
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="codemagic_extension.xsd">
	<Unit xsi:type="mlUnit">
		<Unit_shortname>ml</Unit_shortname>
		<Unit_longname>MilliLiter</Unit_longname>
	</Unit>
	<Unit xsi:type="lUnit">
		<Unit_shortname>l</Unit_shortname>
		<Unit_longname>Liter</Unit_longname>
	</Unit>
	<Unit xsi:type="pcsUnit">
		<Unit_shortname>pcs</Unit_shortname>
		<Unit_longname>Pieces</Unit_longname>
	</Unit>
	<Unit xsi:type="gUnit">
		<Unit_shortname>g</Unit_shortname>
		<Unit_longname>Gramm</Unit_longname>
	</Unit>
	<Unit xsi:type="kgUnit">
		<Unit_shortname>kg</Unit_shortname>
		<Unit_longname>Kilo-Gramm</Unit_longname>
	</Unit>
</Units>
[/XML]


----------



## codemagic (25. Feb 2014)

Vielen herzlichen Dank jetzt hab ich es verstanden 

Wo ist der Danke button?!


----------

