tmohanta
tmohanta

Reputation: 11

xml with same element with different value need a schema

For the following xml need a schema.

<?xml version="1.0" encoding="UTF-8"?>
<overall_operation>
    <operation type="list_products">
        <ops_description>Listing all the products of a company</ops_description>
        <module>powesystem</module>
        <comp_name>APC</comp_name>
        <prod_price>50K$</prod_price>
        <manf_date>2001</manf_date>
        <pool_name>Electrical</pool_name>
        <fail_retry>2</fail_retry>
        <storage_type>avialble</storage_type>
        <storage_check>false</storage_check>
        <api_type>sync</api_type>
        <product_name>transformer</product_name>
    </operation>
    <operation type="search_product">
        <ops_description>Search the products of a company from the repository</ops_description>
        <module>high-voltage</module>
        <module>powesystem</module>
        <comp_name>APC</comp_name>
        <pool_name>Electrical</pool_name>
        <fail_retry>2</fail_retry>
        <storage_type>avialble</storage_type>
        <storage_check>false</storage_check>
        <api_type>sync</api_type>
        <product_name>setup-transformer</product_name>
    </operation>
</overall_operation>

Here different elements with operation like list_products,search_products and so on. Each element will have some common attributes such as ops_description,module and so on.

Also some of the unique attributes for each element such as prod_price,manf_date etc.

I want to have a xml schema to validate. Some of the attributes also optional.

I tried using abstract and derived but could not make it work.

Upvotes: 1

Views: 432

Answers (1)

Filburt
Filburt

Reputation: 18061

What you want to achieve is not possible with xml schema. The definition states that every element or attribute must be validated on its own and without reference to other elements or attributes.

The best solution you can get is to group optional but dependent elements:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="overall_operation">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="operation" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="ops_description" />
                            <xs:element name="module" minOccurs="1" maxOccurs="2" />
                            <xs:element name="comp_name" />
                            <xs:group ref="price_and_date" minOccurs="0" maxOccurs="1" />
                            <xs:element name="pool_name" />
                            <xs:element name="fail_retry" />
                            <xs:element name="storage_type" />
                            <xs:element name="storage_check" />
                            <xs:element name="api_type" />
                            <xs:element name="product_name" />
                        </xs:sequence>
                        <xs:attribute name="type" type="xs:string" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:group name="price_and_date">
        <xs:sequence>
            <xs:element name="prod_price" />
            <xs:element name="manf_date" />
        </xs:sequence>
    </xs:group>
</xs:schema>

Use minOccurs and maxOccurs attributes to control optional elements and groups.

Upvotes: 1

Related Questions