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 works at file level not at schema document level so it is available only in Text mode of XML Schema editor. It can be accessed from the XML Schema text editor's Project view and invoke the action from the view's contextual menu. In this last case the feedback of the action will be presented in the Information view.
. Alternatively you can select one or more schemas in themaster.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>
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>
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>
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>
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>
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 shown in the example below.
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>
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>
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>
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.