Ich versuche schon den ganzen Nachmittag ein XML Schema zu schreiben, dass mir folgende Datei validiert:
<keyelement id=3 />
<keyelement id=4 />
<or>
<and>
<value>
<keyelement><id>4</id></keyelement>
</value>
<not>
<value>
<keyelement><id>3</id></keyelement>
</value>
</and>
<value>
<keyelement><id>33333333</id></keyelement>
</value>
</or>
zur zeit sieht das schema etwa so aus:
<xs:schema>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="keyelement" type="keyelement" maxOccurs="unbounded" />
<xs:group ref="LogicNode" />
</xs:sequence>
</xs:complexType>
<xs:key name="keyelementId">
<xs:selector xpath=".//tns:keyelement" />
<xs:field xpath="@id" />
</xs:key>
<xs:keyref name="keyelementref" refer="keyelementId">
<xs:selector xpath=".//tns:Value" />
<xs:field xpath="tns:id" />
</xs:keyref>
</xs:element>
<xs:complexType name="ValueNode">
<xs:sequence>
<xs:element name="id" type="xs:integer" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="AndNode">
<xs:sequence>
<xs:group ref="LogicNode" />
<xs:group ref="LogicNode" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="OrNode">
<xs:sequence>
<xs:group ref="LogicNode" />
<xs:group ref="LogicNode" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="NotNode">
<xs:sequence>
<xs:group ref="LogicNode" />
<xs:group ref="LogicNode" />
</xs:sequence>
</xs:complexType>
<xs:group name="LogicNode">
<xs:choice>
<xs:element name="And" type="tns:AndNode" />
<xs:element name="Or" type="tns:OrNode" />
<xs:element name="Not" type="tns:NotNode" />
<xs:element name="Value" type="ValueNode"/>
</xs:choice>
</xs:group>
</xs:schema>
Das Problem ist, dass der key und keyref Elemente auf der selben ebene sein müssen. In dem Fall auf root ebene. Das schema ist schaft es nicht Fehler im xml-file zu erkennen.
Ich hab mich schon im Netz darüber schlau gmemacht, dass key bzw. keyrefs in Hierarchischen (rekursiven) Strukturen probleme machen, hab aber nicht entdecken können wie man eine solche Beziehung am besten modelliert.
das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)
Vielen Dank für die Treue und das Verständnis!