Значение 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 ответ:
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>