# [XSD-Definition] Eindeutige Daten in NodeList (Bereich)



## Milo (13. Okt 2011)

Hallo,

ich habe ein kleines Problem bei der Definition einer XSD. Ich möchte innerhalb einer NodeList eindeutige Kind-Elemente haben. Also etwas nach folgendem Schema:

[XML]<reise>
  <orte gid="1">
    <ort pid="berlin"/>
    <ort pid="hamburg"/>
    <ort pid="bern"/>
  </orte>

  <orte gid="2">
    <ort pid="wien"/>
    <ort pid="hamburg"/>
    <ort pid="berlin"/>
  </orte>

  <orte gid="3">
    <ort pid="wien"/>
    <ort pid="berlin"/>
    <ort pid="berlin"/> <!-- Das soll nicht passieren -->
  </orte>
</reise>[/XML]

Eine eindeutige gid für die Orte habe ich hinbekommen:

[XML]<xsd:key name="keyGId">
        <xsd:selector xpath=".//orte"/>
        <xsd:field xpath="@gid"/>
</xsd:key>[/XML]

um keine doppelten Einträge in orte zu bekommen, bin ich auf unique gestoßen. Versucht habe ich eine Kombination aus der pid und der gid zu bilden. Mein Versuch scheint aber nicht korrekt zu sein:

[XML]<xsd:unique name="uniquePid">
        <xsd:selector xpath=".//orte"/>
        <xsd:field xpath="./@gid"/>
        <xsd:field xpath="./ort/@pid"/>
</xsd:unique>[/XML]

Wo liegt mein Fehler?

Besten Dank
Micha


----------



## Milo (22. Okt 2011)

Hallo,

mein Problem scheint doch schwerer zu sein, also ich erwartet habe - sofern meine Problembeschreibung verständlich war. Das schließe ich mal aus den _bisherigen Antworten_. Auch im SELF-Raum konnte mir keiner weiterhelfen.

Ich habe das Beispiel von Torsten Horn mal ausprobiert und auch hier validiert der XML-Hammer die XML-Datei, wenn ich den adresse-Block mit der ID 43 einfach noch einmal drunter kopiere. Könnte es sein, dass es am Validator (XML-Hammer) liegt? Gibt es hier Alternativen (kostenfrei), die Ihr empfehlen könnt?

Über etwas mehr Resonanz würde ich mich freuen ;-)

Schöne Grüße 
Micha


----------



## nillehammer (22. Okt 2011)

Der Schlüssel zum Erfolg ist das xs:unique. Das hast du ja auch selbst schon rausgefunden. Die Schwierigkeit ist die Definition. Dazu folgende Hinweise:
- Der "Raum", in dem Eindeutigkeit herrschen soll, ist das orte-Element. D.h. das xs:unique muss bei der Definition des orte-Elements gemacht werden.
- Die Menge, in der etwas eindeutig sein soll, ist die Menge aller ort-Elemente. D.h. als xs:selector brauchst Du einen, der alle ort-Elemente selektiert
- Das, was eindeutig sein soll, ist das pid-Attribut/Feld. D.h. das xs:field muss entsprechend aussehen.
Nachschlagen kann man das notfalls auch nochmal hier: XML Schema ? Wikipedia


----------



## Milo (23. Okt 2011)

Hi Nillehammer,

mensch, vielen Dank. Mein Plan, den Schlüssel über zwei Attribute zu legen, war ja gar nicht korrekt. Mit der von Dir vorgeschlagenen Lösung funktioniert es sehr gut:

[XML]<xsd:element name="orte" type="orteTyp" minOccurs="1" maxOccurs="unbounded">
	<!-- Eindeutige Namen -->
	<xsd:unique name="uniqueIDs">
		<xsd:selector xpath="./ort" />
		<xsd:field xpath="./@pid"/>
	</xsd:unique>
</xsd:element>[/XML]

Sowas in der Art habe ich beim Rumprobieren auch schon mal gehabt aber immer in Kombination mit der gid, die ich mir nun sogar sparen kann.

Besten Dank!
Micha


----------

