Значение XML элемента зависит от значений других элементов в XSD?


Например, скажем, что оранжевые грузовики GMC стоят 20 000 долларов, а белые и черные грузовики GMC - 10 000 долларов.

Задается следующий XML:

<example>
    <car>
        <make value='GMC'/>
        <model value='Truck'/>
        <configuration>
            <color value="orange"/>
            <bed value="short"/>
            <cab value="regular"/>
        </configuration>
        <price value='10000'/>
    </car>
</example>
XML говорит мне, что мой торговый персонал продает оранжевый грузовик GMC с короткой кроватью и обычной кабиной за 10 000 долларов. Я хочу использовать схему, чтобы предотвратить продажу грузовика моим сотрудникам менее чем за 20 000 долларов.

Могу ли я создать XSD-файл, чтобы применить ограничение, что автомобиль должен быть GMC, грузовик, оранжевый и по цене $20,000. Другими словами, могу ли я основывать ограничение на значениях четырех отдельных элементов?

Пример XML не будет подтвержден, потому что цена меньше $ 20 000 или потому что цвет оранжевый, а не белый или черный. Зависит от того, как вы хотите на это посмотреть.

Обновить

Согласно http://www.ibm.com/developerworks/library/x-xml11pt2/

К сожалению, XML Schema 1.0 не предоставляет способа принудительного выполнения этих требований. правила. Чтобы реализовать такие ограничения, вы должны

  • написать код на уровне приложения (после проверки схемы XML)
  • используйте проверку таблиц стилей (также процесс пост-валидации)
  • используйте другой язык XML-схемы, такой как RelaxNG или Schematron

С постоянными запросами на проверку ограничений совместного возникновения поддержка от сообщества пользователей XML Schema 1.0, XML Schema 1.1 рабочая группа представила концепцию утверждений и тип альтернативы в XML-схеме 1.1, позволяющий авторам XML-схемы, чтобы выразить такое ограничение.

Итак, глядя на мою текущую среду, я использую lxml, который не поддерживает XSD 1.1. Так что мне придется использовать Schematron или RelaxNG.

1 2

1 ответ:

XSD 1.0

Ваши ограничения не могут быть выражены в XSD 1.0.

XSD 1.1

Ваши ограничения могут быть выражены с помощью утверждений в XSD 1.1:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
           vc:minVersion="1.1">
  <xs:element name="example">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="car">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="make" type="valAttrType"/>
              <xs:element name="model" type="valAttrType"/>
              <xs:element name="configuration">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="color" type="valAttrType"/>
                    <xs:element name="bed" type="valAttrType"/>
                    <xs:element name="cab" type="valAttrType"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="price" type="valAttrType"/>
            </xs:sequence>
            <xs:assert test="not(    make/@value='GMC' 
                                 and model/@value='Truck' 
                                 and configuration/color/@value='orange')
                              or number(price/@value)=20000"/>
            <xs:assert test="not(    make/@value='GMC' 
                                 and model/@value='Truck' 
                                 and configuration/color/@value='black')
                              or number(price/@value)=10000"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="valAttrType">
    <xs:attribute name="value" type="xs:string"/>
  </xs:complexType>
</xs:schema>