Thomas J.S.: XML-Schema, XML-Dateien keyref key include

Beitrag lesen

Hallo,

im XML-Schema sieht die Struktur ungefähr so aus:
<xs:element name="Bestellungen">
xs:complexType
  xs:sequence
   <xs:element name="Bestellung">
    xs:complexType
     <xs:attribute name="PersonID" type="xs:positiveInteger"
      use="required"/>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
</xs:complexType>
<xs:keyref name="PersonID2" refer="PersonID">

<xs:selector xpath="Bestellung/Person"/>

Du hast aber kein <Person> in <Bestellung>, dein keryref verweist so auf nichts.

D.h. ich habe kein Wurzel-Element.

Doch, nämlich Bestellungen

Nur das keyref, welches auf den key aus Person "verweist".

Nö, der verweist zwar schon auf das key, aber für den Vergleich verweist er auf gar nix. (keine <Person> in <Bestellung>)

Jetzt möchte ich aber nicht beides in eine Datei, sondern eine Datei "Bestellungen.xml" und eine Datei "Personen.xml" haben. Allerdings habe ich nun das Problem, dass "Bestellungen.xml" nicht gültig ist, das das referenzierte Entity "PersonID" nicht gefunden werden kann.

Wie kriege ich es hin, dass es doch gefunden werden kann? Es wäre doch <xi:include href="Personen.xml"/> in "Bestellungen.xml" möglich, oder? Aber wie bringe ich das dem XML-Schema bei?

Es ist "weniger" das Problem dem Schema das beizubringen, sondern der Anwendung, die deine XML-Instanzdokumente dann validieren soll.
im <schema>
xmlns:xlink="http://www.w3.org/1999/xlink"

dann:

<annotation>
   <appinfo>
     <link xlink:type="simple" xlink:href="personen.xml" xlink:actuate="onRequest" xlink:role="http://www.example.org/wasauchimmer" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase"/>

nur, wie der Name sagt es ist ein appinfo (application information), d.h. deine Anwendung muss dann dieses Element verstehen und auswerten.
Dasselbe gilt für XInclude.

Dann wäre es einfacher, wenn du person.xml mit XInclude in bestellungen.xml einbinden würdest. Die Frage ob deine Anwendung XInclude versteht bleibt in diesem Fall aber auch.

Grüße
Thomas