Конструкция XML-схемы, XML с одним и тем же элементом с разными значениями требует схемы - PullRequest
0 голосов
/ 08 февраля 2012

Итак, у меня проблема с проверкой атрибутов. Я перепробовал все, что знаю, и это не сработало. Если perishable = no, есть некоторые дополнительные элементы, если yes, то есть несколько различных элементов от perishable = no. Я пробовал группы, и это не сработало. Я собирался сгруппировать еду и запасы, но есть ограничение на скоропортящиеся продукты. Только если скоропортящийся продукт - да, у нас есть элемент питания, а если нет - элемент запаса. Помогите пожалуйста !!!

    <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 голосов
/ 09 февраля 2012

Вы не можете использовать атрибуты для управления моделью содержимого элемента, за одним исключением: атрибут xsi: type.Атрибут xsi: type может появиться в вашем экземпляре документа.Он сообщает проверяющему парсеру, какой тип должен использоваться для проверки элемента.Указанный тип должен быть подтипом объявленного типа элемента (или самого объявленного типа).Затем вы должны определить два связанных типа (один расширяет или ограничивает другой, или оба расширяют или ограничивают некоторую общую абстрактную базу).Один из этих типов будет поддерживать случай, когда у вас есть скоропортящийся товар, а другой - при наличии непортящегося предмета.

Однако нет способа контролировать это с помощью атрибута скоропортящихся продуктов.UNLESS, возможно, вы могли бы сделать это, используя утверждения из XSD 1.1 (я не знаю).В последний раз, когда я проверял, XSD 1.1 все еще был только черновиком, но если это вариант для вас, вы можете посмотреть его.Я считаю, что некоторые инструменты поддерживают его (саксонский. Xerces?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...