hvem kan knække en XSD/XML nød !
Hej,jeg er ved at lave et skema, der skal bruges til validering af nogle XML filer, men kan kun få det til at virke, når jeg bruger en ret uelegant løsning (se allernederst).
Mon der er nogen, der kan komme op med noget mere elegant/generelt ?
(gerne en slags rekursion i definitionen, selvom man jo ikke kan bruge cirkulære referencer til <xs:group>)
**********************************
Problemstillingen er barberet ned til følgende:
Der KAN forekomme 3 elementtyper E1, E2 og E3 i XML filen
Der SKAL findes mindst een af elementtyperne E1, E2 eller E3 i XML filen
Elementtype E1 MÅ forekomme med multiple forekomster (hvis den forekommer)
Elementtype E2 og E3 MÅ KUN forekomme een gang (hvis de forekommer)
**********************************
Jeg har problemer med at bruge <xs:choice>, da den jo plukker netop een ud af en række alternativer,og der er brug for een eller flere
Svært at lave rekursion, idet cirkulære referencer i <xs:group> ikke er tilladt
Nedenfor ses en række XML-filer, der skal henholdsvis accepteres af XSD'en og efterfølgende en række XML-filer, der ikke må blive accepteret.
Allernederst ses en XSD, der virker. Den er bare meget uelegant, når problemstillingen udvides til 10 elementtyper E1, E2,...,E10.
Så får jeg jo 10 grupper med hver 10 elementreferencer.
på forhånd tak
************ACCEPT**************
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E1>Text</E1>
<E2>ttt</E2>
<E3>trt</E3>
</Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E1>Text</E1>
<E1>Text</E1>
<E2>ttt</E2>
<E3>trt</E3>
</Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E1>Text</E1>
<E1>Text</E1>
</Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E1>Text</E1>
<E1>Text</E1>
<E3>trt</E3>
</Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E2>ttt</E2>
<E3>trt</E3>
</Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E2>ttt</E2>
</Type>
</ROD>
************EJ ACCEPT**************
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
</Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E1>Text</E1>
<E2>ttt</E2>
<E2>ttt</E2>
<E3>trt</E3>
</Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
<Type>
<E2>ttt</E2>
<E2>ttt</E2>
</Type>
</ROD>
*************virker************
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:group name="G1">
<xs:sequence>
<xs:element ref="E1" maxOccurs="unbounded"/>
<xs:sequence minOccurs="0">
<xs:element ref="E2" minOccurs="0"/>
</xs:sequence>
<xs:sequence minOccurs="0">
<xs:element ref="E3" minOccurs="0"/>
</xs:sequence>
</xs:sequence>
</xs:group>
<xs:group name="G2">
<xs:sequence>
<xs:element ref="E1" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="E2"/>
<xs:element ref="E3" minOccurs="0"/>
</xs:sequence>
</xs:group>
<xs:group name="G3">
<xs:sequence>
<xs:element ref="E1" minOccurs="0" maxOccurs="unbounded"/>
<xs:sequence minOccurs="0">
<xs:element ref="E2" minOccurs="0"/>
</xs:sequence>
<xs:element ref="E3"/>
</xs:sequence>
</xs:group>
<xs:group name="endG"/>
<xs:element name="ROD">
<xs:complexType>
<xs:all>
<xs:element name="Type" nillable="false">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:group ref="G1"/>
<xs:group ref="G2"/>
<xs:group ref="G3"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="E1"/>
<xs:element name="E2"/>
<xs:element name="E3"/>
</xs:schema>
***********************************************************