gifpif
gifpif

Reputation: 4917

Common XSD for two XML

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.

Example:

--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

Answers (1)

Sprotty
Sprotty

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

enter image description here

<?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

enter image description here

<?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

Related Questions