XSD og namespaces.
Jeg skal lave et XSD dokument der skal passe til følgende .xml fil:<?xml version="1.0"?>
<catalog xmlns="CATALOG" xmlns:gr="Group" xmlns:ct="CATALOG" xmlns:tl="TYPELIBNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="CATALOG Catalog.xsd" elementFormDefault="qualified" attributeFormDefault="qualified" >
<contact contactId="1" nationality="gb" gender="male">
<ct:name>
<first>John</first>
<last>Milton</last>
</ct:name>
<ct:address>
<tl:street>2, Main Street</tl:street>
<tl:city>Nottingham</tl:city>
<tl:postalCode>34566</tl:postalCode>
<tl:country>England</tl:country>
</ct:address>
<tl:phone>+44 6765645</tl:phone>
<tl:email>john.milton@work.com</tl:email>
</contact>
</catalog>
Jeg vil så lave xsd filer for hvert namespace, og så importe dem sammen i Catalog.xsd, hvor jeg også beskriver strukturen.
Catalog.xsd :
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2006 U (http://www.altova.com) by Sigurdur Palsson (Vejle hs) -->
<xs:schema xmlns:ct="Contact" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="CATALOG" xmlns:tl="TYPELIBNS">
<xs:import namespace="TYPELIBNS" schemaLocation="TypeLib.xsd"/>
<xs:import namespace="CONTACT" schemaLocation="contactType.xsd"/>
<xs:element name="catalog">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="contact">
<xs:complexType>
<xs:sequence>
<xs:element name="name" >
<xs:complexType>
<xs:sequence>
<xs:element name="first" type="tl:TYPEfirst" />
<xs:element name="middle" minOccurs="0" type="tl:TYPEmiddle" />
<xs:element name="last" type="tl:TYPElast"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="address">
<xs:complexType>
<xs:sequence>
<xs:element name="street"/>
<xs:element name="city"/>
<xs:element name="postal"/>
<xs:element name="country"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Jeg har så også TypeLib.xsd hvor at jeg vil definere typerne, og give det namespace tl: sådan at det passer med xml dokumentet.
TypeLib.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tl="TYPELIBNS" targetNamespace="TYPELIBNS" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="TYPEfirst">
<xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
<xs:simpleType name="TYPEmiddle">
<xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
<xs:simpleType name="TYPElast">
<xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
</xs:schema>
og så har jeg til sidst ContactType.xsd der har namespace prefix ct:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tl="TYPELIBNS" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="CONTACT" xmlns:ct="CONTACT">
<xs:import namespace="TYPELIBNS" schemaLocation="TypeLib.xsd"/>
<xs:element name="name">
<xs:complexType>
<xs:sequence>
<xs:element name="first" type="tl:TYPEfirst"/>
<xs:element name="middle" minOccurs="0" type="tl:TYPEmiddle"/>
<xs:element name="last" type="tl:TYPElast"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Problemet er så at den failer ved
<tl:street>2, Main Street</tl:street> i valideringen.
Det skyldes tl: tagget, den forventer bare street.
Jeg har fjernet tl: i de first og last, for at demonstrere at det er netop pga. tl: tagget, for når de er væk validerer den fint.
Hvordan kan jeg få den til at validere korrekt at de type definationer er i tl targetspacet?