Tohle není ani tak úvod, jako spíš pár mých „výpisků“ – pro interní účely. Není to žádný ucelený návod, jeden poskytuje Jirka Kosek na svých stránkách, ale je to velmi zevrubné. Pak jsou různé materiály „na Googlu“.
Po přečtení úvodu do XSD mi z toho všeho vycházejí následující věci: elementy definujeme pomocí simple a complex typů. Jednoduché typy (simpleType) obsahují jen obsah, naproti tomu složené typy (complexType) mohou obsahovat další elementy, obsah (i mix obsahu s elementy) a také atributy. Příklad komplexního typu s několika podelementy a jedním atributem:
<xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <xsd:element name="shipTo" type="USAddress"/> <xsd:element name="billTo" type="USAddress"/> <xsd:element ref="comment" minOccurs="0"/> <xsd:element name="items" type="Items"/> </xsd:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType>
Elementy nebo typy se mohou odkazovat na jiné:
<xsd:element ref="comment" minOccurs="0"/>
Každý element může obsahovat kardinalitu – minOccurs, maxOccurs. Implicitně jsou nastaveny na jedničku (tj. element se vyskytuje právě jednou) a pomocí těchto dvou atributů lze kardinalitu nastavovat. Jednoduché typy lze snadno rozšiřovat:
<xsd:simpleType name="myInteger"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="10000"/> <xsd:maxInclusive value="99999"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="USState"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="AK"/> <xsd:enumeration value="AL"/> <xsd:enumeration value="AR"/> <!-- and so on ... --> </xsd:restriction> </xsd:simpleType>
Pakliže potřebujeme do jednoduchého typu vložit atribut, tak to musíme udělat takovouto konstrukcí:
<xsd:element name="internationalPrice"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="currency" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>
Tedy nadefinujeme komplexní typ, který bude rozšiřovat (jednoduchý) typ decimal a přidávat nový atribut currency. Podobně lze například nadefinovat element, který nemá žádný obsah (jen atribut):
<xsd:element name="internationalPrice"> <xsd:complexType> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:attribute name="currency" type="xsd:string"/> <xsd:attribute name="value" type="xsd:decimal"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> </xsd:element>
Tento zápis je shodný s tímto:
<xsd:element name="internationalPrice"> <xsd:complexType> <xsd:attribute name="currency" type="xsd:string"/> <xsd:attribute name="value" type="xsd:decimal"/> </xsd:complexType> </xsd:element>
Je to proto, že pakliže napíšeme pouze complexType, tak je to jen zkratka pro complexType s complexContent s restriction na typu anyType. Tento speciální typ obsah nijak neomezuje – může obsahovat všechno.
Nebudu se zabývat dalšími vlastnostmi XSD jako jsou skupiny (group) a atributové skupiny (attributeGroup), zmíním se jen o nulových hodnotách (Nil Values). XSD nabízí možnost přenášení null hodnot:
<xsd:element name="shipDate" type="xsd:date" nillable="true"/>
Diskuze