PDA

View Full Version : [XML schema] "polimorfismo" (.... o qualcosa del genere)


oh my god
23-10-2009, 09:06
ciao,
sto creando degli schema XML che hanno un template comune, ma la definizione degli elementi e differente. mispiego meglio con un esempio.
SITUAZIONE ATTUALE
schema 1:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="definizione1.xsd/>
<xs:element name="documenti">
<xs:complexType>
<xs:sequence>
<xs:element name="documento" minOccurs="0" maxOccurs="unbounded">
<xs:element ref="el1"/>
<xs:element ref="el2"/>
<xs:element ref="el3"/>
<xs:element ref="el4"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>


schema 2:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="definizione2.xsd"/>

<xs:element name="documenti">
<xs:complexType>
<xs:sequence>
<xs:element name="documento" minOccurs="0" maxOccurs="unbounded">
<xs:element ref="el1"/>
<xs:element ref="el2"/>
<xs:element ref="el3"/>
<xs:element ref="el4"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

come è possibile notare i due schema differiscono solamente per l'include equindi vorrei avere un unico file generale di schema.
Esiste una sorta di meccanismo di polimorfismo che mi permette ciò???

Grazie 2^10

Kralizek
23-10-2009, 10:45
non ho visto bene l'esempio che hai postato perché sto a lavoro...

io ho usato questa soluzione per avere una sorta di ereditarietá in xsd


<xs:complexType name="rule">
<xs:all minOccurs="1">
<xs:element name="condition" type="condition" />
</xs:all>
</xs:complexType>

<xs:element name="rule" type="rule" />

<xs:complexType name="condition" abstract="true" />

<xs:complexType name="or">
<xs:complexContent>
<xs:extension base="condition">
<xs:sequence maxOccurs="unbounded" minOccurs="2">
<xs:element name="condition" type="condition" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="and">
<xs:complexContent>
<xs:extension base="condition">
<xs:sequence maxOccurs="unbounded" minOccurs="2">
<xs:element name="condition" type="condition" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="not">
<xs:complexContent>
<xs:extension base="condition">
<xs:all minOccurs="1">
<xs:element name="condition" type="condition" />
</xs:all>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="educationType">
<xs:complexContent>
<xs:extension base="condition">
<xs:attribute name="id" type="xs:int" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="place">
<xs:complexContent>
<xs:extension base="condition">
<xs:attribute name="id" type="xs:int" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>


in questo modo posso scrivere cose come


<rule xmlns="http://www.educations.com/uvml.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<condition xsi:type="educationType" id="5" />
</rule>
-- o --
<rule xmlns="http://www.educations.com/uvml.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<condition xsi:type="or">
<condition xsi:type="mainCategory" id="258" />
<condition xsi:type="mainCategory" id="259" />
<condition xsi:type="mainCategory" id="260" />
</condition>
</rule>
-- o --
<rule xmlns="http://www.educations.com/uvml.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<condition xsi:type="place" id="350" />
</rule>


considera che il parametro ID é comune a tutti i sottotipi, ma non é richiesto che sia cosí

spero ti possa essere utile