Reputation: 4917
I have two XML. that contain some common elements and same unique element on the bases of msgtype tag value. I need to create a common XSD for both. I used choice for unique tags but not working.
--XML AAA--
<?xml version="1.0" encoding="UTF-8"?>
<sf:sf700 xmlns:sf="http://www.test.com/schema/sf100">
<sf:sftMessage>
<sf:msgType>AAA</sf:msgType>
<sf:commonElement1>commonElement1</sf:commonElement1>
<sf:commonElement2>commonElement2</sf:commonElement2>
<sf:TypeAAA1>AAA7011</sf:TypeAAA1>
<sf:TypeAAA2>AAA7012</sf:TypeAAA2>
</sf:sftMessage>
</sf:sf700>
--XML BBB--
<?xml version="1.0" encoding="UTF-8"?>
<sf:sf710 xmlns:sf="http://www.test.com/schema/sf100">
<sf:sftMessage>
<sf:msgType>BBB</sf:msgType>
<sf:commonElement1>commonElement1</sf:commonElement1>
<sf:commonElement2>commonElement2</sf:commonElement2>
<sf:TypeBBB1>BBB7011</sf:TypeBBB1>
<sf:TypeBBB2>BBB7012</sf:TypeBBB2>
</sf:sftMessage>
</sf:sf710>
--XSD--
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://www.test.com/schema/sf100"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sf700">
<xs:complexType>
<xs:sequence>
<xs:element name="sftMessage">
<xs:complexType>
<xs:all>
<xs:element type="xs:string" name="msgType"/>
<xs:element type="xs:string" name="commonElement1"/>
<xs:element type="xs:string" name="commonElement2"/>
<xs:element type="xs:string" name="TypeAAA1"/>
<xs:element type="xs:string" name="TypeAAA2"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
There Common Element commonElement1,commonElement2
are same for msgType AAA and BBB
Upvotes: 2
Views: 459
Reputation: 5973
This will give you the structure, but the validation will not be dependent on the msgType value. This can't be accomplished in XSD 1.0, but could be done using XSD 1.1
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.test.com/schema/sf100" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sf700">
<xs:complexType>
<xs:sequence>
<xs:element name="sftMessage">
<xs:complexType>
<xs:sequence>
<xs:element name="msgType" type="xs:string" />
<xs:element name="commonElement1" type="xs:string" />
<xs:element name="commonElement2" type="xs:string" />
<xs:choice>
<xs:sequence>
<xs:element name="TypeAAA1" type="xs:string" />
<xs:element name="TypeAAA2" type="xs:string" />
</xs:sequence>
<xs:sequence>
<xs:element name="TypeBBB1" type="xs:string" />
<xs:element name="TypeBBB2" type="xs:string" />
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
If you are able to change your XML so it looked more like this, you could accomplish what you want with an XSD 1.0 schema
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com) -->
<sf700 xmlns="http://www.test.com/schema/sf100"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.test.com/schema/sf100 XSDFile2.xsd">
<sftMessage xsi:type="msgTypeAAA" >
<commonElement1></commonElement1>
<commonElement2></commonElement2>
<TypeAAA1></TypeAAA1>
<TypeAAA2></TypeAAA2>
</sftMessage>
</sf700>
Then the following schema would validate it correctly
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.test.com/schema/sf100" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sf700">
<xs:complexType>
<xs:sequence>
<xs:element name="sftMessage" xmlns:q1="http://www.test.com/schema/sf100" type="q1:sftMessageType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType abstract="true" name="sftMessageType">
<xs:sequence>
<xs:element name="commonElement1" type="xs:string" />
<xs:element name="commonElement2" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="msgTypeAAA">
<xs:complexContent>
<xs:extension xmlns:q2="http://www.test.com/schema/sf100" base="q2:sftMessageType">
<xs:sequence>
<xs:element name="TypeAAA1" type="xs:string" />
<xs:element name="TypeAAA2" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="msgTypeBBB">
<xs:complexContent>
<xs:extension xmlns:q2="http://www.test.com/schema/sf100" base="q2:sftMessageType">
<xs:sequence>
<xs:element name="TypeBBB1" type="xs:string" />
<xs:element name="TypeBBB2" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Upvotes: 2