If an XML Schema is organized on several levels linked by xs:include statements sometimes it is more convenient to work on the schema as a single flat file. To flatten schema <oXygen/> recursively adds included files to the master one. That means <oXygen/> replaces the xs:include elements with the ones coming from the included files.
This action can be accessed from the schema editor's contextual menu -> Refactoring -> Flatten Schema.
In the following example master.sxd includes slave.xsd. This, in turn, includes slave1.xsd which includes both slave2.xsd and slave3.xsd.
Listing of master.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tns" xmlns:tns="tns" xmlns:b="b" > <!-- included elements from slave.xsd --> <xs:include schemaLocation="slave.xsd"></xs:include> <!-- master.xsd --> <xs:element name="element1"> <xs:complexType> <xs:sequence> <xs:element ref="tns:element2" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Listing of slave.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tns" xmlns:a="a" xmlns:b="b" xmlns:c="c"> <!-- included elements from slave1.xsd --> <xs:include schemaLocation="slave1.xsd"></xs:include> <!-- slave --> <xs:element name="element2" xmlns:c="x"/> </xs:schema>
Listing of slave1.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tns" xmlns:tns="tns" blockDefault="restriction"> <!-- included elements from slave2.xsd --> <xs:include schemaLocation="slave2.xsd"></xs:include> <!-- included elements from slave3.xsd --> <xs:include schemaLocation="slave3.xsd"></xs:include> <!-- slave1 --> <xs:element name="element0"/> <xs:element name="element7"/> <xs:element name="element7Substitute" substitutionGroup="tns:element7" block="extension"/> <xs:element name="element6"> <xs:complexType> <xs:sequence> <xs:element ref="tns:element7"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="type1"> <xs:sequence> <xs:element ref="tns:element0"/> </xs:sequence> </xs:complexType> </xs:schema>
Listing of slave2.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tns" xmlns:tns="tns" elementFormDefault="qualified" attributeFormDefault="qualified"> <!-- slave2 --> <xs:element name="a"></xs:element> <a:element name="element9" xmlns:a="http://www.w3.org/2001/XMLSchema"> <xs:complexType> <xs:sequence> <!-- This element is from the target namespace --> <xs:element name="element3" xmlns:b="http://www.w3.org/2001/XMLSchema"/> <!-- Element from no namespace --> <xs:element name="element4" form="unqualified"/> <a:element ref="tns:a"></a:element> </xs:sequence> <!-- Attribute from the target namespace --> <b:attribute name="attr1" type="xs:string" xmlns:b="http://www.w3.org/2001/XMLSchema"/> <!-- Attribute from the no namespace --> <xs:attribute name="attr2" type="xs:string" form="unqualified"/> </xs:complexType> </a:element> </xs:schema>
Listing of slave3.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tns" finalDefault="restriction" xmlns:tns="tns"> <!-- slave3 --> <xs:complexType name="ct1"/> <xs:complexType name="ct2" final="extension"> <xs:complexContent> <xs:extension base="tns:ct1"/> </xs:complexContent> </xs:complexType> <xs:simpleType name="st1" final="union"> <xs:restriction base="xs:integer"/> </xs:simpleType> <xs:simpleType name="st2" final="union"> <xs:restriction base="tns:st1"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> </xs:restriction> </xs:simpleType> <xs:element name="e1" type="tns:c1" final="restriction"/> <xs:element name="e2ext" type="tns:c2" substitutionGroup="tns:e1"></xs:element> <xs:complexType name="c1"> <xs:sequence> <xs:element ref="tns:e1"/> </xs:sequence> </xs:complexType> <xs:complexType name="c2"> <xs:complexContent> <xs:extension base="tns:c1"> <xs:sequence> <xs:element ref="tns:e1"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema>
Listing of master.xsd after it has been flattened
<?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="tns" xmlns:a="a" xmlns:b="b" xmlns:c="c" xmlns:tns="tns" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- included elements from slave.xsd --> <!-- included elements from slave1.xsd --> <!-- included elements from slave2.xsd --> <!-- slave2 --> <xs:element block="restriction" name="a"/> <a:element block="restriction" name="element9" xmlns:a="http://www.w3.org/2001/XMLSchema"> <xs:complexType> <xs:sequence> <!-- This element is from the target namespace --> <xs:element block="restriction" form="qualified" name="element3" xmlns:b="http://www.w3.org/2001/XMLSchema"/> <!-- Element from no namespace --> <xs:element block="restriction" form="unqualified" name="element4"/> <a:element ref="tns:a"/> </xs:sequence> <!-- Attribute from the target namespace --> <b:attribute form="qualified" name="attr1" type="xs:string" xmlns:b="http://www.w3.org/2001/XMLSchema"/> <!-- Attribute from the no namespace --> <xs:attribute form="unqualified" name="attr2" type="xs:string"/> </xs:complexType> </a:element> <!-- included elements from slave3.xsd --> <!-- slave3 --> <xs:complexType block="restriction" final="restriction" name="ct1"/> <xs:complexType block="restriction" final="extension" name="ct2"> <xs:complexContent> <xs:extension base="tns:ct1"/> </xs:complexContent> </xs:complexType> <xs:simpleType final="union" name="st1"> <xs:restriction base="xs:integer"/> </xs:simpleType> <xs:simpleType final="union" name="st2"> <xs:restriction base="tns:st1"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> </xs:restriction> </xs:simpleType> <xs:element block="restriction" final="restriction" name="e1" type="tns:c1"/> <xs:element block="restriction" final="restriction" name="e2ext" substitutionGroup="tns:e1" type="tns:c2"/> <xs:complexType block="restriction" final="restriction" name="c1"> <xs:sequence> <xs:element ref="tns:e1"/> </xs:sequence> </xs:complexType> <xs:complexType block="restriction" final="restriction" name="c2"> <xs:complexContent> <xs:extension base="tns:c1"> <xs:sequence> <xs:element ref="tns:e1"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <!-- slave1 --> <xs:element block="restriction" name="element0"/> <xs:element block="restriction" name="element7"/> <xs:element block="extension" name="element7Substitute" substitutionGroup="tns:element7"/> <xs:element block="restriction" name="element6"> <xs:complexType> <xs:sequence> <xs:element ref="tns:element7"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType block="restriction" name="type1"> <xs:sequence> <xs:element ref="tns:element0"/> </xs:sequence> </xs:complexType> <!-- slave --> <xs:element name="element2" xmlns:c="x"/> <!-- master.xsd --> <xs:element name="element1"> <xs:complexType> <xs:sequence> <xs:element ref="tns:element2"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
The case of XML Schema redefinitions is also handled as the example below shows.
Listing of master.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:redefine schemaLocation="slave1.xsd"> <xs:complexType name="tp"> <xs:complexContent> <xs:extension base="tp"> <xs:choice> <xs:element name="el2" type="xs:NCName"/> <xs:element name="el3" type="xs:string"/> </xs:choice> </xs:extension> </xs:complexContent> </xs:complexType> </xs:redefine> <xs:element name="el" type="tp"/> </xs:schema>
Listing of slave1.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:redefine schemaLocation="slave2.xsd"> <xs:complexType name="tp"> <xs:complexContent> <xs:extension base="tp"> <xs:attribute name="a"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:redefine> </xs:schema>
Listing of slave2.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="tp"> <xs:sequence> <xs:element name="el" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema>
Listing of master.xsd after it has been flattened>
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="tp"> <xs:complexContent> <xs:extension base="tp_Redefined1"> <xs:choice> <xs:element name="el2" type="xs:NCName"/> <xs:element name="el3" type="xs:string"/> </xs:choice> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="tp_Redefined1"> <xs:complexContent> <xs:extension base="tp_Redefined0"> <xs:attribute name="a"/> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="tp_Redefined0"> <xs:sequence> <xs:element name="el" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="el" type="tp"/> </xs:schema>
The references to the included schema files can be resolved through an XML Catalog.