XML Schema构造,具有不同值的相同元素的xml需要一个模式

时间:2012-02-08 19:50:18

标签: xsd

所以我在检查属性方面遇到了问题。到目前为止,我已经尝试了我所知道的一切,但它没有奏效。如果易腐=否有一些额外的元素,如果是,则有一些不同的元素来自易腐=否。我尝试过团体而且没有用。我当时想把食物和库存分组,但对易腐烂有限制。只有在易腐烂的情况下,我们才有食物元素,如果没有,我们就有库存元素。请帮助!!!

    <product id = "p12" perishable = "yes">
    <name>Ice cream</name>
    <manufacturer>xsz Co.</manufacturer>
    <quantity>25</quantity>
    <price>2</price>

    <food>
        <nutrition>
            <calcium>10.30</calcium>
            <proteins>35.5</proteins>
            <fat>10</fat>
        </nutrition>

        <expirationDate>2000-09-12</expirationDate>
    </food>
</product>

<product id = "p13" perishable = "no">
    <name>AA Battries</name>
    <manufacturer>DCells</manufacturer>
    <quantity>100</quantity>
    <price>4</price>

    <stock>
        <warehouse id = "w12">
        xsz warehouse
            <stock>25000</stock>
        </warehouse>

        <warehouse id = "w13">
        rza warehouse
            <stock>5000</stock>
        </warehouse>
    </stock>

</product>

<!-- defining the nutrition element for the perishable product -->

<xs:element name="nutrition">   
    <xs:complexType>
        <xs:sequence>
            <xs:element name="calcium" type="xs:decimal"/>
            <xs:element name="proteins" type="xs:decimal"/>
            <xs:element name="fat" type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<!-- defining the group product that is perishable -->

<xs:group name="perishableGroup">
    <xs:sequence>
        <xs:element name="product">
            <xs:complexType>
                <xs:sequence> 
                    <xs:element name="name" type="xs:string"/>
                    <xs:element name="manufacturer" type="xs:string"/>
                    <xs:element name="quantity" type="xs:positiveInteger"/>
                    <xs:element name="price" type="xs:decimal"/>
                    <xs:element name="food">
                        <xs:complexType> <!-- defining the food element for perishable product -->
                            <xs:sequence>
                                <xs:element ref="nutrition"/> <!-- defined above -->
                                <xs:element name="expirationDate" type="xs:date"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="id" type="xs:ID" use="required"/>
                <xs:attribute name="perishable" type="xs:string" use="required" fixed="yes"/>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:group>

<!-- defining the group product that is nonperishable -->

<xs:group name="nonperishableGroup">
    <xs:sequence>
        <xs:element name="product">
            <xs:complexType>
                <xs:sequence> 
                    <xs:element name="name" type="xs:string"/>
                    <xs:element name="manufacturer" type="xs:string"/>
                    <xs:element name="quantity" type="xs:positiveInteger"/>
                    <xs:element name="price" type="xs:decimal"/>
                    <xs:element name="stock">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="warehouse" maxOccurs="unbounded">
                                    <xs:complexType mixed="true">
                                        <xs:sequence>
                                            <xs:element name="stock" type="xs:positiveInteger"/>
                                        </xs:sequence>
                                        <xs:attribute name="id" type="xs:ID" use="required"/>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="id" type="xs:ID" use="required"/>
                <xs:attribute name="perishable" type="xs:string" use="required" fixed="no"/>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:group>

<xs:element name="products">
    <xs:complexType>
        <xs:choice minOccurs="1" maxOccurs="unbounded">
            <xs:group ref="perishableGroup"/>
            <xs:group ref="nonperishableGroup"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

1 个答案:

答案 0 :(得分:0)

您不能使用属性来控制元素的内容模型,但有一个例外:xsi:type属性。 xsi:type属性可以出现在您的实例文档中。它告诉验证解析器应该使用什么类型来验证元素。指定的类型必须是元素声明类型的子类型(或声明的类型本身)。然后,您将定义两个相关类型(一个扩展或限制另一个,或者扩展或限制一些常见的抽象基础)。其中一种类型可以支持您拥有易腐物品的情况,另一种支持您拥有不易腐烂的物品。

然而,使用perishable属性无法控制它。除非你可能使用XSD 1.1中的断言(我不知道)。最后我检查过,XSD 1.1仍然只是一个草稿,但如果这是一个选项,你可以调查一下。我相信有些工具支持它(Saxon.Xerces?)