具有不同值的相同元素的xml需要一个模式

时间:2011-02-18 07:00:06

标签: xsd

对于以下xml需要架构。

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

此处不同的元素包含list_productssearch_products等操作。 每个元素都有一些共同的属性,例如ops_descriptionmodule等等。

每个元素的一些独特属性,例如prod_pricemanf_date等。

我想要一个xml架构来验证。一些属性也是可选的。

我尝试使用抽象和派生但无法使其工作。

1 个答案:

答案 0 :(得分:1)

xml架构无法实现您想要实现的目标。该定义规定每个元素或属性必须单独验证,而不引用其他元素或属性。

您可以获得的最佳解决方案是group可选但依赖的元素:

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

使用minOccursmaxOccurs属性来控制可选元素和组。